2015-06-19 34 views
3

添加列到data.table我试图做到的,是类似 快速SQL加入类中的R

select * 
from T left join 
    T2 on T1.key2 = T2.key2 
    left join T3 on T1.key3 = T3.key3 

但R中使用data.table为SQL。具体而言,从T2附加'两个列和从T3到第一个表的一个列。
我目前的解决方案看起来像

setkey(t1,key2) 
t1 <- t2[t1] 
setkey(t1,key3) 
t1 <- t3[t1] 
setkey(t1,key1) # restore the original key 

这会将整个T1两次,是不是太快。在“内部”t1是一个相当大的数据集~1毫米行,t2和t3只是小型的“映射”表。
我认为使用J(..)可能会有所帮助,但我对data.tables是新手,并且无法真正了解如何在此处应用它。
有人可以请建议一个更快的连接解决方​​案吗?由于

+1

你可以显示一个可重现的例子与期望的输出?我怀疑你看起来像[this]这样的东西(http://stackoverflow.com/questions/30913338/join-two-data-tables-and-use-only-one-column-from-second-dt-in -r/30914530#30914530) –

+0

是的,这与我所寻找的非常接近。一个具体的 - 是否有必要setkey(dt1)来实现这一点?设置密钥将重新排列内存中的data.table,对吧? –

+0

是的,但设置密钥非常高效,即使在1e8行数据集上也不到一秒钟。更重要的是,在二进制连接之后,您不会丢失密钥,例如'DT < - data.table(A = letters [1:4]); DT2 < - data.table(A = letters [1:3]); setkey(DT,A); DT [DT2,B:= i.A];键(DT)'。所以你可以继续加入其他太多的表格,只需设置一次。 –

回答

1

由于devel version of data.table, v1.9.5最近实施的能够加入data.tables功能直接而无需使用新的on参数设置键,我可以提供一个优质的回答你的问题:

t1[t2, colT2 := i.colT2, on = c(key2="key2") 
    ][t3, colT3 := i.colT3, on = c(key3="key3") 
    ][] 

它也应该保留您的原始密钥t1

+0

我想这会适用于大多数人,但由于我坚持data.table 1.9.2的原因 –