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

如何在保留原变量的同时批量重编码R语言数据框中的变量?

解决问卷变量重编码并保留原变量的问题

原代码使用mutate_at直接修改了选中的原变量,导致原变量被覆盖,无法生成带r后缀的新变量。以下是两种可行的解决方案:

方案一:使用dplyr::across(推荐,适配新版dplyr)

利用across函数指定要处理的变量,通过.names参数设置新变量的命名规则(原变量名+r),同时应用清晰的重编码逻辑:

library(dplyr)

# 示例数据集
df <- data.frame(
  P7A = c(1, 2, 3, 4, 5),
  P7B = c(2, 4, 1, 3, 5),
  P7C = c(1, 5, 3, 3, 2),
  P7D = c(3, 2, 2, 1, 4),
  P7E = c(5, 4, 5, 3, 2),
  P7F = c(1, 2, 3, 2, 1))

# 选中需要重编码的变量
vP7 <- c("P7A", "P7B", "P7C", "P7D", "P7E", "P7F")

# 生成带r后缀的新变量,保留原变量
df <- df %>%
  mutate(across(all_of(vP7), 
                ~ case_when(
                  .x %in% 1:2 ~ 1,
                  .x == 3 ~ 2,
                  .x %in% 4:5 ~ 3
                ),
                .names = "{col}r"))

关键说明

  • across(all_of(vP7)):精准指定需要处理的目标变量列表
  • case_when:用自然逻辑定义重编码规则,比recode更直观易读
  • .names = "{col}r":自动生成新变量名,{col}会替换为原变量名,最终得到P7Ar、P7Br等符合要求的变量

方案二:使用recode结合批量变量复制

如果习惯用recode函数,可先批量复制原变量生成新列,再对新列进行重编码:

library(dplyr)
library(magrittr)

df <- data.frame(
  P7A = c(1, 2, 3, 4, 5),
  P7B = c(2, 4, 1, 3, 5),
  P7C = c(1, 5, 3, 3, 2),
  P7D = c(3, 2, 2, 1, 4),
  P7E = c(5, 4, 5, 3, 2),
  P7F = c(1, 2, 3, 2, 1))

vP7 <- c("P7A", "P7B", "P7C", "P7D", "P7E", "P7F")

# 先复制原变量为带r后缀的新列,再对新列重编码
df <- df %>%
  mutate(!!!set_names(vP7, paste0(vP7, "r"))) %>%
  mutate_at(paste0(vP7, "r"), recode, `1`=1, `2`=1, `3`=2, `4`=3, `5`=3)

关键说明

  • !!!set_names(vP7, paste0(vP7, "r")):通过非标准评估批量复制原变量,快速生成带r后缀的新列
  • mutate_at仅针对新生成的列操作,完全保留原变量不受影响

验证结果

执行代码后,运行print(df)即可查看数据集,原变量(P7AP7F)和重编码后的新变量(P7ArP7Fr)会同时存在,且新变量完全符合重编码规则。

内容的提问来源于stack exchange,提问作者alagua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:52:38