首页 > 解决方案 > 通过匹配对应的列,根据另一个表条件有效地添加一个 data.table 长度

问题描述

我有两个 data.table 对象:

dt <- data.table(
  a = c(1, 1, 2), 
  s = c(1, 2, 5), 
  o = c("A", "A", "A")
)

dt2 <- data.table(
  a = c(1, 1, 2, 2),
  g = c(1, 2, 3, 4)  
)  

dt2中的每个a都有g的两个元素。我想将a in dta in dt2匹配。然后在dt中,每行将重复 2 次(因为 dt2 中的每个 a 都有 2 个元素。当然, dt2 中的每个a可能不同数量元素。这意味着dt2中的条件决定了我如何附加相应的gdt2dt),并附加相应的gdt2dt的最后一列。决赛桌应该是这样的:

fnl <- data.table(
  a = c(1, 1, 1, 1, 2, 2), 
  s = c(1, 1, 2, 2, 5, 5), 
  o = c("A", "A", "A", "A", "A", "A"),
  g = c(1, 2, 1, 2, 3, 4)
)

为了清楚起见,这里是两个输入表和一个输出表。

> dt
   a s o
1: 1 1 A
2: 1 2 A
3: 2 5 A
> dt2
   a g
1: 1 1
2: 1 2
3: 2 3
4: 2 4
> fnl
   a s o g
1: 1 1 A 1
2: 1 1 A 2
3: 1 2 A 1
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4

我知道使用 for-loop 我可以完成任务,但是我的数据太大,你能帮忙弄清楚什么是有效的方法吗?

标签: rdata.table

解决方案


由于您使用的是 data.tables 这很容易:

dt[dt2, on='a']

给你

> dt[dt2, on='a']
   a s o g
1: 1 1 A 1
2: 1 2 A 1
3: 1 1 A 2
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4

推荐阅读