【问题标题】:data.table join (multiple) selected columns with new namesdata.table 连接(多个)具有新名称的选定列
【发布时间】:2019-11-03 17:33:10
【问题描述】:

我喜欢连接两个表,它们有一些相同的列(名称和值),而另一些则没有。我只对加入那些不相同的人感兴趣,我想为他们确定一个新名字。对于我拥有 100 多列的真实表,我目前的做法似乎很冗长且难以处理,即我想提前确定要连接的列,而不是在 join 语句中。可重现的例子:

# create table 1
DT1 = data.table(id = 1:5, x=letters[1:5], a=11:15, b=21:25)
# create table 2 with changed values for a, b via pre-determined cols
DT2 = copy(DT1)
cols <- c("a", "b")
DT2[, (cols) := lapply(.SD, function(x) x*2), .SDcols = cols]

# this both works but is verbose for many columns
DT1[DT2, c("a_new", "b_new") := list(i.a, i.b), on=c(id="id")]
DT1[DT2, `:=` (a_new=i.a, b_new=i.b), on = c(id="id")]

我在想这样的事情(不起作用):

cols_new <- c("a_new", "b_new")
cols <- c("a", "b")
DT1[DT2, cols_new := i.cols, on=c(id="id")]

【问题讨论】:

  • 使用mget() 如图here...
  • 太棒了!完全按照我的设想工作。 tks!
  • mget() 解释在哪里?

标签: r join data.table


【解决方案1】:

根据 Arun 的建议更新答案:

cols_old <- c('i.a', 'i.b')
DT1[DT2, (cols_new) := mget(cols_old), on = c(id = "id")]

您也可以通过以下方式生成cols_old

paste0('i.', gsub('_new', '', cols_new, fixed = TRUE))

查看历史以获取旧答案。

【讨论】:

  • 不太一样。第一行创建了一个全新的data.table,随着数据量的增加,效率会降低。
  • 实际上之前尝试过 get() 但肯定做错了,否则 mget() 工作方式不同。还是要完全理解是怎么回事。 tks!
  • @Triam 我也不知道mget,但get 不起作用,因为它只是一列,而mget 是多列。
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 2016-07-20
  • 2015-10-29
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多