2015-06-19 66 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的原因 –