2016-04-11 27 views
0

假設我有以下data.tables:合併data.tables表示可變有序對

X1 X2 val1 
A B 1 
B C 2 
C A 3 

X1 X2 val2 
A B 100 
C B 200 
A C 300 

其中(X1,X2)的每一種組合中的每個data.table出現一次,但訂購不確定。我瞄準這個輸出:

X1 X2 val1 val2 
A B 1 100 
B C 2 200 
C A 3 300 

什麼是最有效的方法來做到這一點?特別是如果有第三個data.table包含第三個值列,並且具有相同的情況,則返回:X1,X2等。

回答

3

這樣的情況如何?

special_join <- function(x, y, xcols, ycols=xcols) { 
    ix1 = y[x, on=structure(xcols, names=ycols), which=TRUE] 
    ix2 = y[x, on=structure(rev(xcols), names=ycols), which=TRUE] 
    pmax(ix1, ix2, na.rm=TRUE) 
} 
ix = special_join(dt1, dt2, names(dt1)[1:2]) 
dt1[, val2 := dt2$val2[ix]] 

其中,

dt1 = fread('X1 X2 val1 
A B 1 
B C 2 
C A 3') 

dt2 = fread('X1 X2 val2 
A B 100 
C B 200 
A C 300') 

我會離開這個改編爲您3 data.table作爲練習的一部分。

+0

謝謝,我認爲這工作!但是我得到(更長,但截斷字符限制):'警告消息: 在\ [[.data.table \'(host.pairs,,''= \'(percent.id,sim $ percent.id [ ix])): 通過獲取data.table的(淺)副本,檢測並修復了無效的.internal.selfref,以便:可以通過引用添加此新列。在更早的時候,這個data.table已經被R拷貝了(或者使用structure()或類似的方式手動創建)。避免關鍵< - ,名稱< - 和attr < - 它在R中(並且奇怪地)可以複製整個data.table。)' – wkc