如何在R的data.table中关联表并拼接匹配行的字符列
解决data.table按关联键拼接字符列的问题
需求说明
将两个data.table按Id关联,把dt1中同一Id对应的Name列拼接成字符串,合并到dt2中得到目标表。
初始数据
library(data.table) dt1 <- data.table(rbind(c(Id=1, Name="Apple"),c(Id=1, Name="Orange"), c(Id=2, Name="Banana"))) # dt1输出: # Id Name # 1: 1 Apple # 2: 1 Orange # 3: 2 Banana dt2 <- data.table(rbind(c(Id=1, Flavor="Sweet"),c(Id=2, Flavor="Bland"))) # dt2输出: # Id Flavor # 1: 1 Sweet # 2: 2 Bland
期望结果
dt3 <- data.table(rbind(c(Id=1, Flavor="Sweet", Names="Apple; Orange"),c(Id=2, Flavor="Bland", Names="Banana"))) # dt3输出: # Id Flavor Names # 1: 1 Sweet Apple; Orange # 2: 2 Bland Banana
问题分析
你之前的尝试失败核心原因是paste函数用错了参数:
- 只加
sep参数只会处理单个元素的分隔,无法把同组的多个值拼接成一个字符串; - 需要用
collapse参数指定组内元素的拼接分隔符。
正确解决方案
提供两种高效实现方式:
方法1:先聚合再关联
先对dt1按Id分组拼接Name,再和dt2关联:
# 第一步:聚合dt1生成按Id拼接的Names列 dt1_agg <- dt1[, .(Names = paste(Name, collapse = "; ")), by = Id] # 第二步:关联dt2得到结果 dt3 <- dt2[dt1_agg, on = .(Id)]
方法2:关联时直接聚合
利用data.table的.EACHI参数,在连接过程中完成分组拼接:
dt3 <- dt2[dt1, .(Flavor = first(Flavor), Names = paste(Name, collapse = "; ")), by = .EACHI, on = .(Id)]
验证结果
运行上述任意一种方法,输出结果都会和期望一致:
> dt3 Id Flavor Names 1: 1 Sweet Apple; Orange 2: 2 Bland Banana
内容的提问来源于stack exchange,提问作者C8H10N4O2
相关产品推荐
相关产品推荐

