【发布时间】:2015-06-19 09:04:42
【问题描述】:
我想要实现的目标类似于 SQL
select *
from T left join
T2 on T1.key2 = T2.key2
left join T3 on T1.key3 = T3.key3
但在 R 中使用 data.table。具体来说,将 T2 中的 两个 列和 T3 中的 一个 列“追加”到第一个表。
我目前的解决方案看起来像
setkey(t1,key2)
t1 <- t2[t1]
setkey(t1,key3)
t1 <- t3[t1]
setkey(t1,key1) # restore the original key
这会复制整个 t1 两次并且不会太快。在“内部”t1 是一个相当大的数据集 ~ 100 万行,t2 和 t3 只是小的“映射”表。
我认为使用 J(..) 可能会有所帮助,但我是 data.tables 的新手,无法真正理解如何在此处应用它。
有人可以建议一个更快的加入解决方案吗?谢谢
【问题讨论】:
-
您能否展示一个具有所需输出的可重现示例?我怀疑你正在寻找类似 @987654321@ 的敌人
-
是的,这与我正在寻找的非常接近。一个具体的 - 是否有必要 setkey(dt1) 来实现这一目标?设置密钥会在内存中重新排序 data.table,对吧?
-
是的,但是设置一个键非常有效,即使在 1e8 行数据集上也只需不到一秒的时间。此外,在二元连接之后,您不会丢失密钥,例如
DT <- data.table(A = letters[1:4]) ; DT2 <- data.table(A = letters[1:3]) ; setkey(DT, A) ; DT[DT2, B := i.A] ; key(DT)。因此,您只需设置一次即可继续加入其他表。 -
David 为
t1[t2, col1 := i.col1]提到的语法应该允许您根本不复制整个t1。如果它解决了您的问题,您可以自行回答您的问题。这在实施时也可能会有所帮助:data.table#1130 -
另外,
dt1[dt2, col1 := i.col1]不创建列。即当我在加入后运行ls(dt1)时没有col1。可能对 t2 进行键控还有其他要求吗?
标签: sql r data.table