使用dplyr的recode_factor函数时,如何保留未重编码的因子值而非转为NA
解决recode_factor仅修改指定因子值、保留其余值的问题
这问题我之前也踩过坑!dplyr::recode_factor()的默认行为是把所有没明确指定映射规则的因子水平转为NA,想要只修改目标值、保留其他原有因子的话,有几个实用的办法:
方法1:利用recode_factor的.default参数
recode_factor提供了.default参数,可以指定未匹配到规则时的默认值,我们直接用.x(代表当前列的原始值)就能保留原有因子:
library(tibble) library(dplyr) test <- tibble( test_vec = as.factor(c(1, 2, 3)) ) # 仅修改3为4,其余保留 test %>% mutate(test_vec = recode_factor(test_vec, `3` = 4, .default = .x))
运行后结果会是:
#> # A tibble: 3 x 1 #> test_vec #> <fct> #> 1 1 #> 2 2 #> 3 4
方法2:使用forcats包的fct_recode
forcats包的fct_recode()是专门处理因子重编码的函数,它的默认逻辑就是只修改指定的水平,其余原样保留,不需要额外参数,用起来更直观:
library(forcats) test %>% mutate(test_vec = fct_recode(test_vec, "4" = "3"))
注意这里参数顺序是新值 = 旧值,和recode_factor相反,这点要留意哦。
方法3:用case_when处理复杂场景
如果需要更灵活的多条件重编码,case_when也是个好选择,只要在最后加上TRUE ~ 原始值的分支就能保留其余值:
test %>% mutate(test_vec = case_when( test_vec == "3" ~ factor("4"), # 匹配到3时转为4的因子 TRUE ~ test_vec # 其他情况保留原始值 ))
这个方法适合需要同时处理多个不同重编码规则的场景,扩展性更强。
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

