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

R语言:使用summarise_all分组聚合时如何保留唯一值并去重?

问题:按variant和ID分组后聚合合并非重复值

需要按variant和ID两列对数据框分组,将其余列的行聚合合并,要求排除重复字符串和NA值,仅保留唯一的字符串与数值。

示例数据:

df = data.frame(
    variant = c("1-12345-GT", "1-12345-GT", "2-3456-C-T", "3-45567-C-A", "4-566879-C-T", "4-566879-C-T"),
    ID=c("A", "A", "B", "C", "D", "D"),
    value1=c( "GJB1", "GJB1", "TBC", "TZY", "FBY", "FBY"),
    value2=c( 0.5, 1, 0.5, 0.5, 0.5, 0.5)
)

# 原始数据框输出
#        variant ID value1 value2
# 1   1-12345-GT  A   GJB1    0.5
# 2   1-12345-GT  A   GJB1    1.0
# 3   2-3456-C-T  B    TBC    0.5
# 4  3-45567-C-A  C    TZY    0.5
# 5 4-566879-C-T  D    FBY    0.5
# 6 4-566879-C-T  D    FBY    0.5

尝试过的代码(存在重复值问题):

df %>% group_by(variant, ID) %>% summarise_all(~(toString(na.omit(.)))) 

该代码会保留重复值(如第1行的GJB1重复,第4行的FBY和0.5重复),但需要保留第1行中0.5和1两个唯一值。

也尝试过拆分去重再聚合,但仍无法消除重复:

df %>% separate_rows(value1, value2) %>% unique() %>% group_by(variant, ID) %>% summarise_all(~(toString(na.omit(.)))) %>% ungroup()

解决方案

直接在summarise_all的处理函数中先提取唯一值,再剔除NA,最后转为字符串即可,核心是先调用unique()去重:

library(dplyr)

df %>% 
  group_by(variant, ID) %>% 
  summarise_all(~toString(na.omit(unique(.))), .groups = "drop")

输出结果:

# A tibble: 4 × 4
  variant       ID    value1 value2
  <chr>         <chr> <chr>  <chr> 
1 1-12345-GT    A     GJB1   0.5, 1
2 2-3456-C-T    B     TBC    0.5   
3 3-45567-C-A   C     TZY    0.5   
4 4-566879-C-T  D     FBY    0.5   

说明:

  • unique(.)先提取当前分组内的唯一值,解决重复字符串/数值的问题;
  • na.omit()剔除NA值(若数据中存在NA);
  • toString()将唯一值合并为逗号分隔的字符串;
  • .groups = "drop"用于取消分组状态,返回普通数据框(可根据需求调整)。

之前的separate_rows方法无效,是因为拆分后会将每行的value1和value2拆分为独立行,但原数据中value1的重复是和value2的不同值绑定的,拆分去重无法精准针对单列去重,而直接在分组聚合时对单列先去重是更直接的方案。

内容的提问来源于stack exchange,提问作者Sanna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:43:36