如何使用tidyverse/dplyr将同ID的去重值汇总为列表列
dplyr按ID分组汇总去重值实现方案
需求说明
给定如下测试数据集,需要按ID维度分组,提取每个ID对应的所有不重复value值,汇总成结果表:
ID value character 001 A JABA 002 B FABA 001 B RABA 003 D RIBI 003 TT LENI 004 A LENT 001 A TATA 004 N YAYA 004 N YANA
预期输出格式:
ID values 001 [A,B] 002 [B] 003 [D,TT] 004 [A,N]
完整实现代码
# 加载依赖包 library(dplyr) # 构造示例源数据 df <- data.frame( ID = c("001","002","001","003","003","004","001","004","004"), value = c("A","B","B","D","TT","A","A","N","N"), character = c("JABA","FABA","RABA","RIBI","LENI","LENT","TATA","YAYA","YANA") ) # 分组汇总计算 res <- df %>% group_by(ID) %>% summarise( values = paste0("[", paste(unique(value), collapse = ","), "]"), .groups = "drop" )
代码逻辑说明
- 用
group_by(ID)指定按ID字段分组,后续汇总操作会在每个ID分组内独立执行 unique(value)会自动过滤当前分组内value列的重复值,只保留唯一取值- 两层
paste操作负责把去重后的值拼接成带方括号、逗号分隔的字符串格式,和示例输出完全匹配 - 加
.groups = "drop"参数是为了汇总完成后自动解除分组,避免后续操作受分组状态干扰
如果不需要固定的字符串输出格式,后续还要对汇总后的值做计算,更推荐存为列表列格式,处理更灵活:
res_list <- df %>% group_by(ID) %>% summarise( values = list(unique(value)), .groups = "drop" )
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

