【问题标题】:Merge two data tables but avoid duplicate columns合并两个数据表但避免重复列
【发布时间】:2016-06-29 16:25:09
【问题描述】:

我有两个数据表,datdat2。两个表中都有一些列,但每个表中的值不一定相同。

当我使用 dat[dat2] 合并两个表时,一切都按预期工作,除了我有一些重复的列名。例如,名为Status 的列出现在两个表中,合并后,来自dat2 的列显示为i.Status。而不是重命名这些列,我只是想将它们从表中完全删除。最简单的方法是什么?

【问题讨论】:

  • 您可以在合并后删除它们,也可以在合并期间进行子集化。
  • 最简单的方法是提供要保留的列,以防止加入 j 参数。
  • 我试图避免手动输入所有列名。我可以在合并后删除以 i. 开头的列,但这是一个 hack

标签: r merge data.table


【解决方案1】:

下面是一些代码来说明我提到的两种场景的方法,尽管可能有一些更奇特(更有效)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

【讨论】:

  • keep &lt;- union(names(dt), names(dt2)) ; dt[dt2, mget(keep), on = "id"]
  • @DavidArenburg 这样更好,它避免了恼人的-which() 语法。
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多