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
相关产品推荐
相关产品推荐

