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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:25:16