2017-06-08 208 views
1

假設我有兩個數據表:R數據表:LEFT OUTER JOIN

X <- data.table(id = 1:5, L = letters[1:5]) 

    id L 
1: 1 a 
2: 2 b 
3: 3 c 
4: 4 d 
5: 5 e 

Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12)) 

    id L N 
1: 3 NA 10 
2: 4 g NA 
3: 5 h 12 

有沒有可能做一個左外使用內置函數表的數據由id加盟XY?如果不是這樣,我想建立一個函數(如leftOuterJoin)與下列預期輸出:

leftOuterJoin(X, Y, on = "id") 

    id L N 
1: 1 a NA 
2: 2 b NA 
3: 3 NA 10 
4: 4 g NA 
5: 5 h 12 

我都沒有成功嘗試:

X[Y, on = "id"] 

    id L i.L N 
1: 3 c NA 10 
2: 4 d g NA 
3: 5 e h 12 

我也嘗試過這一點,這是幾乎我在尋找:

setkey(X, id) 
setkey(Y, id) 
merge(X, Y, all.x = TRUE) 

    id L.x L.y N 
1: 1 a NA NA 
2: 2 b NA NA 
3: 3 c NA 10 
4: 4 d g NA 
5: 5 e h 12 
+0

@jogo看起來不錯,但我的問題是,我將不得不重新分配,我想更新每個變量/加。這是我想避免的,因爲我的數據表有很多列。 – mat

回答

4

這是一個更新聯接:

library(data.table) 
X <- data.table(id = 1:5, L = letters[1:5]) 
Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12)) 
X[Y, on=.(id), c("L", "N"):=.(i.L, i.N)][] 
# id L N 
# 1: 1 a NA 
# 2: 2 b NA 
# 3: 3 NA 10 
# 4: 4 g NA 
# 5: 5 h 12 

給你想要的結果。
Here我發現多個列的解決方案:

library(data.table) 
X <- data.table(id = 1:5, L = letters[1:5]) 
Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12)) 

X[Y, on=.(id), names(Y)[-1]:=mget(paste0("i.", names(Y)[-1]))] 

另一個變化:

n <- names(Y) 
X[Y, on=.(id), (n):=mget(paste0("i.", n))] 
+0

正如我在我以前的評論中提到的,這是有效的。不過,我想避免重新分配,因爲我的原始數據表非常大,重命名每個變量會很麻煩。如果沒有其他答案/更新,我會接受你的。謝謝! – mat

+1

最終可以使用這個答案:https://stackoverflow.com/a/36364865/5414452 – jogo

+0

這是一個非常不錯的改進!我會這樣說:'X [Y,on =「id」,名稱(Y)%>%。[!. %in「id」]:= mget(paste0(「i。」,names(Y)%>%。[!。%in%「id」]))]'因爲「id」可能不是第一列 – mat