2015-02-09 129 views
2

我有兩個數據集,我要地圖的第二個數據集的第一個:合併兩個`data.table`對象

n <- c(2, 3, 5,6,7,8) 
s <- c("aa", "bb", "cc","aa", "bb", "cc") 
b <- c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE) 
df <- data.table(n, s, b) 

rs <- c("aa", "bb", "cc") 
replace1 <- c("Product 1", "Product 2", "Product 3") 
replace2 <- c("Customer 1", "Customer 2", "Customer 3") 

df.replace <- data.table(rs, replace1, replace2) 

所以基本上如果dfaa,我要添加一列有Product 1Customer 1

此外,我還使用data.table包來提高速度,因爲我的文件每個都大於2 GB。映射文件以及我必須將值映射到的文件。

任何建議如何在R中實現這一點?

更新

我想要的輸出:

enter image description here

+1

10您希望的輸出結果如何? – 2015-02-09 12:26:54

+0

@DavidArenburg Thx爲您解答!請看看我上傳的圖片。 – mrquad 2015-02-09 12:31:07

回答

4

你只需要使用data.table小號二進制聯接做右連接

setkey(df, s) # key `df` by `s` 
(Res <- df[df.replace]) # Perform the binary join 
# n s  b replace1 replace2 
# 1: 2 aa TRUE Product 1 Customer 1 
# 2: 6 aa FALSE Product 1 Customer 1 
# 3: 3 bb FALSE Product 2 Customer 2 
# 4: 7 bb TRUE Product 2 Customer 2 
# 5: 5 cc TRUE Product 3 Customer 3 
# 6: 8 cc FALSE Product 3 Customer 3 

編輯

或(根據您的評論),你也可以做一個左加入二進制加入

setkey(df.replace, rs) # key `df.replace` by `rs` 
setkey(df, s) # key `df` by `s` 
(Res <- df.replace[df]) 
# rs replace1 replace2 n  b 
# 1: aa Product 1 Customer 1 2 TRUE 
# 2: aa Product 1 Customer 1 6 FALSE 
# 3: bb Product 2 Customer 2 3 FALSE 
# 4: bb Product 2 Customer 2 7 TRUE 
# 5: cc Product 3 Customer 3 5 TRUE 
# 6: cc Product 3 Customer 3 8 FALSE 

有了這個加入,如果你有df.replace值不匹配,它不會從df刪除行和分配NA s到相關列


更好的選擇(如果df.replace中沒有太多列),請參考df來分配這些值。這樣,您不需要將結果保存在任何地方,並且df將自行更新。

setkey(df, s) # key `df` by `s` 
df[df.replace, 
     `:=`(replace1 = replace1, 
       replace2 = replace2) 
    ] # Perform the binary join and save results in `df` 
+0

Thx爲您的答案!最早的問題是,如果df.replace中沒有匹配的行被刪除,但是,我想得到一個NA或這樣的東西?任何建議如何與data.tables做到這一點? – mrquad 2015-02-09 14:36:43

+1

查看我的編輯上面左邊的二進制連接。 – 2015-02-09 18:12:46