在R语言中按Name-Question分组识别多列重复值
解决方案(基于tidyverse)
步骤1:识别每个Name-Question组内的重复值
先将宽格式的V1-V86列转为长格式,统计组内各值的出现次数,筛选出重复项:
library(tidyverse) # 提取每个Name-Question组的重复值集合 group_duplicates <- df %>% group_by(Name, Question) %>% # 把V1-V86转为长格式,统一处理每个值 pivot_longer(cols = starts_with("V"), names_to = "var", values_to = "value") %>% # 过滤空值/缺失值(根据实际数据调整) filter(!is.na(value) & value != "") %>% # 统计每个值在组内的出现次数 count(value) %>% # 保留出现次数>1的重复值 filter(n > 1) %>% # 每个组的重复值打包为列表 summarize(duplicate_items = list(value)) %>% ungroup()
步骤2:将重复值标记映射回原数据框
把组内重复值集合合并回原数据,新增列标记每行是否包含重复值,或列出具体重复项:
# 生成带重复值标记的新数据框 result_df <- df %>% left_join(group_duplicates, by = c("Name", "Question")) %>% # 标记该行是否包含组内重复值 mutate(has_duplicate = pmap_lgl( across(starts_with("V")), ~ any(c(...) %in% unlist(duplicate_items)) ), # 列出该行包含的所有重复值(可选列) row_duplicates = pmap_chr( across(starts_with("V")), ~ paste(unique(c(...) [c(...) %in% unlist(duplicate_items)]), collapse = ", ") )) %>% # 处理无重复值的组,将空值转为空字符串 mutate(row_duplicates = ifelse(is.na(row_duplicates), "", row_duplicates))
关键说明
- 用
pivot_longer转长格式彻底解决了合并V1-V86时的行长度不一致问题,因为每个值都被单独统计,无需处理整行的长度差异。 list(value)将每个组的重复值存为列表列,避免了因组内重复值数量不同导致的行数不匹配问题。pmap_lgl/pmap_chr逐行检查V1-V86列,快速匹配组内的重复值集合,生成标记结果。
内容的提问来源于stack exchange,提问作者Bettina
相关产品推荐
相关产品推荐

