如何在forcats的fct_collapse中结合tidyselect选择器处理因子水平
R语言fct_collapse结合字符串匹配批量合并因子水平方案
报错原因
starts_with()、contains()等tidyselect系列选择器,仅支持在select()、rename()、across()等dplyr列选择语境中使用,无法直接识别因子的水平列表,因此直接在fct_collapse中调用会触发语境错误。
解决方案
fct_collapse的类别参数接收字符向量作为待合并的水平值,因此我们可以先提取因子的现有水平,通过字符串匹配函数筛选出符合条件的水平后传入即可,无需逐一罗列水平。
完整可运行代码
首先加载依赖包:
library(tidyverse)
示例数据构造:
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")))
写法1:结合base::grep实现匹配
factor_df <- factor_df %>% mutate(new_fct = fct_collapse(my_factor, a = c(grep("^a_", levels(my_factor), value = TRUE), "also_factor_a"), b = grep("_b_", levels(my_factor), value = TRUE) ))
写法2:结合stringr函数匹配(语义更清晰)
factor_df <- factor_df %>% mutate(new_fct = fct_collapse(my_factor, a = c(levels(my_factor)[str_starts(levels(my_factor), "a_")], "also_factor_a"), b = levels(my_factor)[str_detect(levels(my_factor), "_b_")] ))
结果验证
运行以下代码查看合并后的因子水平:
levels(factor_df$new_fct)
输出结果为:
[1] "a" "b"
内容的提问来源于stack exchange,提问作者Rasul89
相关产品推荐
相关产品推荐

