如何在mutate_at的vars中添加多条件,分别重编码js和js_R_类变量?
解决
mutate_at区分含"js"不含"R"列的重编码问题 你可以通过在vars()中组合多条件筛选,精准区分两类列,再分别应用重编码规则。以下是具体实现:
方法1:vars()组合条件筛选
直接用contains()结合逻辑运算符&和!,筛选出含"js"但不含"R"的列,再对两类列分别调用mutate_at:
library(dplyr) # 定义两类列的重编码规则 js_recode <- c( "Strongly agree" = 5, "Agree" = 4, "Neither" = 3, "Disagree" = 2, "Strongly disagree" = 1 ) js_R_recode <- c( "Strongly disagree" = 5, "Disagree" = 4, "Neither" = 3, "Agree" = 2, "Strongly agree" = 1 ) # 执行重编码 d1_encoded <- d1 %>% # 处理含js但不含_R_的列 mutate_at(vars(contains("js") & !contains("_R_")), ~ recode(., !!!js_recode)) %>% # 处理含js_R_的列 mutate_at(vars(contains("js_R_")), ~ recode(., !!!js_R_recode)) print(d1_encoded)
方法2:正则匹配更精准筛选
如果列名规则固定,也可以用matches()配合正则表达式,匹配以js开头但不紧跟_R_的列:
d1_encoded_regex <- d1 %>% mutate_at(vars(matches("^js(?!_R_)")), ~ recode(., !!!js_recode)) %>% mutate_at(vars(matches("js_R_")), ~ recode(., !!!js_R_recode))
推荐:使用across()替代mutate_at(dplyr 1.0.0+)
mutate_at已被软弃用,新版本dplyr推荐用across(),写法更简洁灵活:
d1_encoded_across <- d1 %>% mutate( across(contains("js") & !contains("_R_"), ~ recode(., !!!js_recode)), across(contains("js_R_"), ~ recode(., !!!js_R_recode)) )
内容的提问来源于stack exchange,提问作者sdS
相关产品推荐
相关产品推荐

