我有两个数据表,dat
和dat2
。两个表中都有一些列,但每个列中的值不一定相同。
当我使用dat[dat2]
合并两个表时,一切都按预期工作,除了我有一些重复的列名。例如,两个表中都会显示名为Status
的列,合并后,dat2
中的列显示为i.Status
。我不想重命名这些列,而只想将它们从表中删除。最简单的方法是什么?
答案 0 :(得分:1)
下面是一些代码来说明我提到的两个场景的方法,尽管可能有一些更高级(更高效)的var hexValue = parseInt(substring, 2).toString(16);
if(hexValue.length == 1) hexValue = '0'+hexValue
(版本1.9.6)方法。
这两种方法都会动态适应变量重叠,因此您不必担心手动输入名称。
data.table
这里的数据没有丢失:
# 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))
方法1 :使用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
和intersect
函数进行合并/加入期间的子集。
mget
方法2 :使用# 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"]
grep
这两种方法都返回
dt3 <- dt[dt2, on="id"]
dt3[, grep("^i\\.", names(dt3), value=TRUE) := NULL]