R data.table使用新名称联接(多个)选定列

R data.table使用新名称联接(多个)选定列,r,join,data.table,R,Join,Data.table,我喜欢连接两个表,它们有一些相同的列(名称和值),另一些则不相同。我只想加入那些不完全相同的,我想为他们确定一个新的名字。对于我拥有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,

我喜欢连接两个表,它们有一些相同的列(名称和值),另一些则不相同。我只想加入那些不完全相同的,我想为他们确定一个新的名字。对于我拥有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")]
#创建表1
DT1=数据表(id=1:5,x=字母[1:5],a=11:15,b=21:25)
#通过预先确定的COL创建表2,其中包含a、b的更改值
DT2=复制(DT1)

cols根据Arun的建议更新了答案:

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


有关旧答案,请参阅历史记录。

使用
mget()
如图所示…太棒了!和我想象的一模一样。tks!mget()的解释在哪里?不太一样。。第一行创建了一个全新的data.table,随着数据大小的增加,它的效率会降低。实际上,以前尝试过get(),但肯定是做错了,或者mget()的工作方式不同。仍然必须完全理解发生了什么。tks@Triam我也不知道
mget
,但是
get
不起作用,因为它只是一列,而as
mget
用于多列。
cols_old <- c('i.a', 'i.b')
DT1[DT2, (cols_new) := mget(cols_old), on = c(id = "id")]
paste0('i.', gsub('_new', '', cols_new, fixed = TRUE))