如何在保留原变量的同时批量重编码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
相关产品推荐
相关产品推荐

