R语言:合并数据框中基于Check条件的重复Likert问题列
解决方案:合并基于二元选择的重复Likert问题列
以下提供两种高效的R语言实现方案,适配不同数量的重复列场景:
先模拟你的数据
首先还原你的数据集(注意:如果原始数据中空值是空字符串,先执行df[df == ""] <- NA转换为R标准缺失值):
df <- data.frame( Check = c(1,1,2,2), Q1 = c(5,2,NA,NA), Q2 = c(5,5,NA,NA), Q3 = c(4,3,NA,NA), Q1.1 = c(NA,NA,4,4), Q2.1 = c(NA,NA,6,2), Q3.1 = c(NA,NA,3,1) )
方法1:dplyr批量处理(适合列数较少或明确对应关系的场景)
利用across函数批量遍历所有目标列,根据Check值匹配对应列:
library(dplyr) df_merged <- df %>% # 批量处理每一组Q列:Check=1取原列,Check=2取后缀.1的列 mutate( across(starts_with("Q") & !ends_with(".1"), ~case_when( Check == 1 ~ ., Check == 2 ~ get(paste0(cur_column(), ".1")), TRUE ~ NA_real_ )), .keep = "unused" # 自动移除所有.1结尾的重复列 )
方法2:tidyr重塑法(适合大量重复列的通用场景)
通过数据重塑自动匹配问题组,无需手动指定每一列:
library(tidyr) library(dplyr) df_merged <- df %>% # 将宽表转长表,拆分问题名和分组后缀 pivot_longer( cols = -Check, names_to = c("question", "group"), names_pattern = "(Q\\d+)\\.?(.*)", # 正则捕获Q编号和分组 values_drop_na = TRUE ) %>% # 过滤出Check与分组匹配的行 filter((Check == 1 & group == "") | (Check == 2 & group == "1")) %>% # 转回宽表格式 pivot_wider( id_cols = Check, names_from = question, values_from = value )
两种方法最终输出的结果均符合你的需求:
| Check | Q1 | Q2 | Q3 |
|---|---|---|---|
| 1 | 5 | 5 | 4 |
| 1 | 2 | 5 | 3 |
| 2 | 4 | 6 | 3 |
| 2 | 4 | 2 | 1 |
内容的提问来源于stack exchange,提问作者poppiytt
相关产品推荐
相关产品推荐

