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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:25:40