2012-11-21 76 views
11

只是不知道是否有一個有效的方式做到外與數據表連接,如外連接data.table [R

a <- data.table(a=c(1,2,3),b=c(3,4,5)) 
b <- data.table(a=c(1,2),k=c(1,2)) 
merge(a,b,by="a",all.x=T) 

這工作得很好,但它是效率不高的內部與大數據結合,因爲以下運行速度非常快,但上面的速度非常慢。

setkey(a,a) 
setkey(b,a) 
a[b,] 
+0

在第一種情況下,'a'和'b'是不加鍵的,所以'merge'需要先鍵入它們(作爲本地拷貝(種類)),因爲它不想改變'a'和' b'在調用範圍內)。在第二種情況下,你很樂意通過鍵入它們來改變'a'和'b'(你是否有時間這麼做?),然後'a [b]'快。但即使如此,我驚訝有很大的差異。合併_應該與'x [y]'相當。在談論計時時請註明版本信息:您是否在v1.8.6上?而且你的「非常快」和「非常慢」可能是我的「相似」的想法!什麼是實際時間? –

+0

這很容易導致嚴重/不恰當的基準測試,因此我們絕對需要在說出任何內容之前查看您的計時方法。 –

+0

我無法爲此提供時間,因爲第一次爆炸在記憶中並且撞毀了R會話(加入了大約19米線)。我會用一個較小的集合對它進行基準測試併發布結果。 (版本1.8.2,我正在使用) – jamborta

回答

10

b[a,]是您要查找的「外連接」。

更多細節請看?merge.data.table

+0

謝謝!所以[b,]或b [a,]本質上是一個左連接(用SQL術語來說)?我一直認爲它是一個內部聯接。 – jamborta

+0

@jamborta查看常見問題解答2.16('nomatch = 0 | NA') –

+1

感謝馬修,這解釋了它。我認爲這樣你不能做全外連接(只留下外部和內部)? – jamborta