R语言data.table中如何将重复行对应的多个id合并到单个单元格
实现方法
你可以直接利用data.table的分组聚合能力完成需求,无需先去重再关联id:
方法1:手动指定分组列(适配你的示例场景)
library(data.table) dt <- data.table(id=1:3, Q1=c(1,2,1), Q2=c(3,1,3), Q3=c("a","b","a"), Q4=c("d","c","d")) # 按Q1~Q4分组,同组id拼接为逗号分隔的字符串 res <- dt[, .(id = toString(id)), by = .(Q1, Q2, Q3, Q4)] # 调整列顺序和原表一致 setcolorder(res, c("id", "Q1", "Q2", "Q3", "Q4"))
运行后得到的结果和你预期完全一致:
> res id Q1 Q2 Q3 Q4 1: 1,3 1 3 a d 2: 2 2 1 b c
方法2:自动匹配分组列(适合Q列数量多的场景)
如果前缀为Q的属性列数量很多,不想手动逐个写,可以通过列名匹配自动生成分组字段:
# 匹配所有以Q开头的列作为分组依据 group_cols <- grep("^Q", names(dt), value = TRUE) res <- dt[, .(id = toString(id)), by = group_cols] # 调整列顺序 setcolorder(res, c("id", group_cols))
自定义分隔符说明
如果你不想用逗号加空格的默认分隔格式,可以把toString(id)替换为自定义的paste写法,比如用纯逗号分隔:
res <- dt[, .(id = paste(id, collapse = ",")), by = .(Q1, Q2, Q3, Q4)]
内容的提问来源于stack exchange,提问作者MDSF
相关产品推荐
相关产品推荐

