R语言批量合并问卷英西版本诊断变量的高效实现方案需求
解决方案
这里提供两种可直接运行的批量处理方案,第一种符合你提到的dplyr函数使用习惯,第二种为无需额外依赖的base R方案。
Tidyverse 实现方案
使用dplyr的across()(替代已软弃用的mutate_at)结合正则匹配变量对即可实现批量处理,完全适配你的合并规则:
首先加载依赖包:
library(tidyverse)
执行批量合并:
# 提取所有英文版本诊断的基础变量名(匹配prev_dx开头且无_span后缀的列) dx_base_names <- str_subset(names(sample_data), "^prev_dx.*(?<!_span)$") sample_data_merged <- sample_data %>% mutate( across(all_of(dx_base_names), ~ as.integer( # NA默认视为未确诊,任意一个语种变量取值为1则合并结果为1 coalesce(.x == 1, FALSE) | coalesce(get(paste0(cur_column(), "_span")) == 1, FALSE) ), # 直接覆盖原英文变量名,如需保留原变量可修改为 .names = "{.col}_merged" 生成新列 .names = "{.col}" ) )
以你提供的样本数据验证:id=5的受访者英文版本抑郁症、广泛性焦虑诊断为0,西语版本为1,合并后两个变量取值均为1,完全符合预期。
Base R 实现方案
如果不想加载额外依赖包,也可以用基础循环实现:
# 提取基础变量名 dx_base_names <- grep("^prev_dx.*(?<!_span)$", names(sample_data), perl = TRUE, value = TRUE) # 循环合并每个语种变量对 for (dx in dx_base_names) { span_col <- paste0(dx, "_span") sample_data[[dx]] <- as.integer(sample_data[[dx]] %in% 1 | sample_data[[span_col]] %in% 1) }
内容的提问来源于stack exchange,提问作者runlikeagirl
相关产品推荐
相关产品推荐

