2016-06-29 36 views
-2

我有兩個數據表,datdat2。有兩列出現在兩個表中,儘管值不一定相同。合併兩個數據表,但避免重複列

當我使用dat[dat2]合併這兩個表格時,一切都按預期工作,除了我有一些重複的列名稱。例如,名爲Status的列出現在兩個表中,並且在合併時,dat2的列顯示爲i.Status。我不想重新命名這些列,而只想完全從表中刪除它們。什麼是最簡單的方法來做到這一點?

+1

您可以在合併後刪除它們,或者您可以在合併過程中的子集。 – lmo

+2

最簡單的方法是提供你想要加入到'j'參數的列。 – jangorecki

+0

我試圖避免手動輸入所有的列名稱。我可以在合併後刪除以'i.'開頭的列,但這是一個破解 – Jeff

回答

1

下面是一些代碼來說明我提到的兩種方案的方法,雖然可能有一些fancier(更高效)data.table(版本1.9.6)方法。

兩種方法都會動態適應變量重疊,因此您不必擔心手動輸入名稱。

# get some data 
set.seed(1234) 
dt <- data.table(id=1:10, a=letters[1:10], b=rnorm(10), d=rnorm(10)) 
dt2 <- data.table(id=1:10, a=letters[5:14], c=rnorm(10), d=rnorm(10)) 

這裏的數據不會丟失:

dt[dt2, on="id"] 

    id a   b   d i.a   c  i.d 
1: 1 a -1.2070657 -0.47719270 e 0.1340882 1.1022975 
2: 2 b 0.2774292 -0.99838644 f -0.4906859 -0.4755931 
3: 3 c 1.0844412 -0.77625389 g -0.4405479 -0.7094400 
4: 4 d -2.3456977 0.06445882 h 0.4595894 -0.5012581 
5: 5 e 0.4291247 0.95949406 i -0.6937202 -1.6290935 
6: 6 f 0.5060559 -0.11028549 j -1.4482049 -1.1676193 
7: 7 g -0.5747400 -0.51100951 k 0.5747557 -2.1800396 
8: 8 h -0.5466319 -0.91119542 l -1.0236557 -1.3409932 
9: 9 i -0.5644520 -0.83717168 m -0.0151383 -0.2942939 
10: 10 j -0.8900378 2.41583518 n -0.9359486 -0.4658975 

方法1:在合併期間子集和/加入使用intersectmget功能。

# assuming your id variable is the first column in both sets: 
dropVars <- intersect(names(dt), names(dt2))[-1] 

dt[dt2[, mget(names(dt2)[-which(names(dt2) %in% dropVars)])], on="id"] 

方法2:合併後滴用grep

dt3 <- dt[dt2, on="id"] 
dt3[, grep("^i\\.", names(dt3), value=TRUE) := NULL] 

這些方法均返回

id a   b   d   c 
1: 1 a -1.2070657 -0.47719270 0.1340882 
2: 2 b 0.2774292 -0.99838644 -0.4906859 
3: 3 c 1.0844412 -0.77625389 -0.4405479 
4: 4 d -2.3456977 0.06445882 0.4595894 
5: 5 e 0.4291247 0.95949406 -0.6937202 
6: 6 f 0.5060559 -0.11028549 -1.4482049 
7: 7 g -0.5747400 -0.51100951 0.5747557 
8: 8 h -0.5466319 -0.91119542 -1.0236557 
9: 9 i -0.5644520 -0.83717168 -0.0151383 
10: 10 j -0.8900378 2.41583518 -0.9359486 
+1

或'keep < - union(names(dt),names(dt2)); dt [dt2,mget(keep),on =「id」]' –

+0

@DavidArenburg這樣更好,它避免了令人煩惱的'-which()'語法。 – lmo