0

我有一个杂乱无章的因子变量,其中包含各种非常相似的因子水平(例如,由拼写错误引入,措辞略有不同等)。我正在尝试使用 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

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

4

1 回答 1

0

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   
于 2021-09-29T19:04:43.423 回答