【问题标题】:R - Using forcats fct_collapse in combination with tidyselect selection helpersR - 结合使用 forcats fct_collapse 和 tidyselect 选择助手
【发布时间】:2021-09-29 19:01:49
【问题描述】:

我有一个混乱的因子变量,其中包含各种非常相似的因子水平(例如,由拼写错误、稍微不同的措辞等引入)。 我正在尝试使用 forcats 包中的 fct_collapse 函数将该因素分为四个主要类别。

但是,考虑到可变性的数量,我想将 fct_collapse 函数与 tidy selct 中的选择帮助器(例如starts_with() 和 contains())结合起来。

这是一个简单的可重现示例:具有不同级别的单个因子列,我想将其减少为两个因子级别“a”和“b”。

 factor_df<-tibble(my_factor=factor(c("a_1","a_2","a_x","a_factor","a_factor","also_factor_a", 
                                      "1_b_1","2_b_2","xx_b_xx")))

我不想列出每一个因素,而是尽可能使用选择助手为我做这件事。 但是下面的代码会报错:

factor_df%>%
            mutate(new_fct=fct_collapse(factor_df$my_factor,
                                        a=c(starts_with("a_"), "also_factor_a"),
                                        b=c(tidyselect::contains("_b_"))))

错误:starts_with() 必须在 选择 函数中使用。 我见https://tidyselect.r-lib.org/reference/faq-selection-context.html

(该链接并不太有用。) 使用辅助函数如何做到这一点?

【问题讨论】:

  • 选择辅助函数仅适用于选择列。使用 stringr 函数进行一般字符串匹配。

标签: r categories startswith forcats tidyselect


【解决方案1】:

starts_with 来自dplyr,它正在寻找列名而不是列中的值。我们可以使用grepstartsWith

library(dplyr)
library(forcats)
factor_df %>% 
   mutate(new_fct = fct_collapse(my_factor,
     a = c(levels(my_factor)[startsWith(levels(my_factor), "a_")], 
      "also_factor_a"), b = grep("_b_", levels(my_factor), value = TRUE)))

-输出

# A tibble: 9 × 2
  my_factor     new_fct
  <fct>         <fct>  
1 a_1           a      
2 a_2           a      
3 a_x           a      
4 a_factor      a      
5 a_factor      a      
6 also_factor_a a      
7 1_b_1         b      
8 2_b_2         b      
9 xx_b_xx       b   

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多