You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:30:26