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

如何用R的data.table从多对多关联中提取ID的一对一匹配

解决方案:用data.table实现ID1与ID3的严格一对一匹配

代码实现

library(data.table)

# 初始化数据
Table1 <- data.table(ID1 = c(1, 1, 2, 3, 4, 5, 5, 6),
                     ID2 = c(101, 102, 102, 103, 104, 105, 106, 107))

Table2 <- data.table(ID2 = c(101, 102, 103, 103, 104, 105, 106, 108),
                     ID3 = c(201, 202, 203, 204, 205, 206, 206, 207))

# 1. 内连接两张表,仅保留两边共有的ID2
joined_dt <- Table1[Table2, on = "ID2", nomatch = 0]

# 2. 筛选出仅对应唯一ID3的ID1集合
valid_id1 <- joined_dt[, if (uniqueN(ID3) == 1) .(ID1), by = ID1]$ID1

# 3. 从第一步结果中,筛选出仅对应唯一ID1的ID3集合
filtered_dt <- joined_dt[ID1 %in% valid_id1]
valid_id3 <- filtered_dt[, if (uniqueN(ID1) == 1) .(ID3), by = ID3]$ID3

# 4. 提取最终结果并去重排序
final_result <- unique(filtered_dt[ID3 %in% valid_id3, .(ID1, ID3)])[order(ID1)]

# 查看结果
final_result

运行结果

ID1 ID3
1:   4 205
2:   5 206

步骤说明

  1. 内连接数据:使用nomatch = 0只保留两张表中都存在的ID2,直接排除单边出现的ID(如107、108)。
  2. 筛选唯一ID1:通过uniqueN(ID3)统计每个ID1对应的唯一ID3数量,只保留数量为1的ID1——确保一个ID1不会对应多个不同的ID3。
  3. 筛选唯一ID3:在上述结果基础上,用同样的方法统计每个ID3对应的唯一ID1数量,只保留数量为1的ID3——确保一个ID3不会对应多个不同的ID1。
  4. 去重排序:由于部分ID1可能通过多个ID2关联到同一个ID3(如ID5对应ID2=105、106,但ID3都是206),用unique()去重后按ID1排序得到最终结果。

内容的提问来源于stack exchange,提问作者rw2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:22:45