我有兩個數據表,dat
和dat2
。有兩列出現在兩個表中,儘管值不一定相同。合併兩個數據表,但避免重複列
當我使用dat[dat2]
合併這兩個表格時,一切都按預期工作,除了我有一些重複的列名稱。例如,名爲Status
的列出現在兩個表中,並且在合併時,dat2
的列顯示爲i.Status
。我不想重新命名這些列,而只想完全從表中刪除它們。什麼是最簡單的方法來做到這一點?
我有兩個數據表,dat
和dat2
。有兩列出現在兩個表中,儘管值不一定相同。合併兩個數據表,但避免重複列
當我使用dat[dat2]
合併這兩個表格時,一切都按預期工作,除了我有一些重複的列名稱。例如,名爲Status
的列出現在兩個表中,並且在合併時,dat2
的列顯示爲i.Status
。我不想重新命名這些列,而只想完全從表中刪除它們。什麼是最簡單的方法來做到這一點?
下面是一些代碼來說明我提到的兩種方案的方法,雖然可能有一些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:在合併期間子集和/加入使用intersect
和mget
功能。
# 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
或'keep < - union(names(dt),names(dt2)); dt [dt2,mget(keep),on =「id」]' –
@DavidArenburg這樣更好,它避免了令人煩惱的'-which()'語法。 – lmo
您可以在合併後刪除它們,或者您可以在合併過程中的子集。 – lmo
最簡單的方法是提供你想要加入到'j'參數的列。 – jangorecki
我試圖避免手動輸入所有的列名稱。我可以在合併後刪除以'i.'開頭的列,但這是一個破解 – Jeff