2015-04-25 64 views
19

我有兩個data.table XY如何通過不同的列名合併兩個data.table?

X:在area, id, value
列Ÿ
ID, price, sales

創建兩個data.tables:

X = data.table(area=c('US', 'UK', 'EU'), 
       id=c('c001', 'c002', 'c003'), 
       value=c(100, 200, 300) 
      ) 

Y = data.table(ID=c('c001', 'c002', 'c003'), 
       price=c(500, 200, 400), 
       sales=c(20, 30, 15) 
      ) 

而我爲了X設置鍵ÿ

setkey(X, id) 
setkey(Y, ID) 

現在我嘗試idXIDŸ加入Xÿ

merge(X, Y) 
merge(X, Y, by=c('id', 'ID')) 
merge(X, Y, by.x='id', by.y='ID') 

所有提出的錯誤說法在by參數中的無效列名稱。

我參考了data.table的手冊,發現merge函數不支持by.xby.y的參數。

如何在不更改列名稱的情況下按不同列名稱連接兩個data.tables

追加
我設法X[Y]加入兩個表,但爲什麼merge功能data.table失敗?

+4

請檢查http://stackoverflow.com/questions/16047253/merging-tables-with-different-column-names或http:// stackoverflow.com/questions/27612859/joining-tables-based-on-different-column-names – akrun

+0

@akrun謝謝。我確實檢查了這兩個帖子。我設法通過'X [Y]'加入** X **和** Y **,但我仍然無法通過使用merge函數來完成它。我很困惑爲什麼'merge'在data.table中失敗。 – Zelong

+2

by.x和by.y尚未針對data.tables實施。 FR被提交。檢查http://stackoverflow.com/questions/14069796/merging-data-tables-based-on-columns-names –

回答

12

使用此操作:

X[Y] 
# area id value price sales 
# 1: US c001 100 500 20 
# 2: UK c002 200 200 30 
# 3: EU c003 300 400 15 

或此操作:

Y[X] 
#  ID price sales area value 
# 1: c001 500 20 US 100 
# 2: c002 200 30 UK 200 
# 3: c003 400 15 EU 300 

編輯您編輯您的問題後,我讀了FAQ的1.12節:「什麼是X之間的didifference [Y]和合並(X,Y)?「,這導致我結帳?merge,我發現有兩種不同的合併函數,這取決於您使用的是哪個軟件包。默認值是merge.data.frame,但data.table使用merge.data.table。比較

merge(X, Y, by.x = "id", by.y = "ID") # which is merge.data.table 
# Error in merge.data.table(X, Y, by.x = "id", by.y = "ID") : 
# A non-empty vector of column names for `by` is required. 

merge.data.frame(X, Y, by.x = "id", by.y = "ID") 
#  id area value price sales 
# 1 c001 US 100 500 20 
# 2 c002 UK 200 200 30 
# 3 c003 EU 300 400 15 

編輯爲基於comment由@邁克爾Bernsteiner,它看起來像data.table團隊正計劃實現by.xby.ymerge.data.table功能規劃,但不是招完整性還沒有完成。

3

當您使用by.xby.ydata.table合併失敗。以你的數據:

> merge(X,Y, by.x='id', by.y='ID') 
Error in merge.data.table(X, Y, by.x = "id", by.y = "ID") 

您可以使用data.table與合併,但你需要使用by參數進行連接(這樣命名列具有相同的colnames

Y = setNames(Y,c('id','price','sales')) 

這還是不行:

merge(X,Y, by.x='id', by.y='id') 
Error in merge.data.table(X, Y, by.x = "id", by.y = "id") : 

但是這將工作:

> merge(X,Y, by='id') 
#  id area value price sales 
#1: c001 US 100 500 20 
#2: c002 UK 200 200 30 
#3: c003 EU 300 400 15 

另外,您將需要data.table轉換爲data.frame爲了使用mergeby.xby.y參數:

merge(data.frame(X), data.frame(Y), by.x='id', by.y='ID') 
+0

你也可以做'library(dplyr); XY < - setDT(left_join(tbl_df(X),tbl_df(Y),by = c(「id」=「ID」)))' –

+0

考慮到'data.table'的更新,這個答案不再正確 – tospig

16

隨着1.9.6版本data.table(CRAN上08月2015),你可以指定在​​

merge(x=X, y=Y, by.x="id", by.y="ID")[] 
#  id area value price sales 
#1: c001 US 100 500 20 
#2: c002 UK 200 200 30 
#3: c003 EU 300 400 15 

by.xby.y參數然而,在data.table 1.9.6可以 specfy在X[Y]符號

X [Y]的語法現在可以加入,而不必使用新的論點上設置鍵on參數。例如:DT1 [DT2,on = c(x =「y」)]會將DT2的列「y」與DT1的「x」相加。 DT1 [DT2,on =「y」]將加入兩個data.tables的列「y」。

X[Y, on=c(id = "ID")] 
# area id value price sales 
#1: US c001 100 500 20 
#2: UK c002 200 200 30 
#3: EU c003 300 400 15 

this answerdata.table作者有更多的細節

+0

this在這一點上是真正的答案...... –

+0

使用第一個方法還是第二個方法會更好? – skan

+1

@skan - 我不確定我可以說哪個更好。請注意,'data.table :: merge'默認情況下設置'sort = TRUE',它將在結果數據上設置一個鍵。如果你沒有使用密鑰,這是要注意的事情 – tospig

相關問題