通过引用将所有列合并到data.table中

J.P*_*ier 3 r data.table

我想data.table通过引用将两个合并在一起,而不必写下我要合并的所有变量。这是一个了解我的需求的简单示例:

set.seed(20170711)
(a <- data.table(v_key=seq(1, 5), key="v_key"))
#   v_key
#1:     1
#2:     2
#3:     3
#4:     4
#5:     5

a_backup <- copy(a)

(b <- data.table(v_key=seq(1, 5), v1=runif(5), v2=runif(5), v3=runif(5), key="v_key"))
#   v_key          v1        v2          v3
#1:     1 0.141804303 0.1311052 0.354798849
#2:     2 0.425955903 0.3635612 0.950234261
#3:     3 0.001070379 0.4615936 0.359660693
#4:     4 0.453054854 0.5768500 0.008470552
#5:     5 0.951767837 0.1649903 0.565894298
Run Code Online (Sandbox Code Playgroud)

我想在不指定列名的情况下将每个列复制ba引用中。

我可以执行以下操作,但这会无缘无故地复制对象,从而降低程序性能并增加所需的RAM:

(a  <- a[b])
#   v_key          v1        v2          v3
#1:     1 0.141804303 0.1311052 0.354798849
#2:     2 0.425955903 0.3635612 0.950234261
#3:     3 0.001070379 0.4615936 0.359660693
#4:     4 0.453054854 0.5768500 0.008470552
#5:     5 0.951767837 0.1649903 0.565894298
Run Code Online (Sandbox Code Playgroud)

另一个选择(没有无用的副本)是指定的每一列的名称b,结果如下:

a <- copy(a_backup)
a[b, `:=`(v1=v1, v2=v2, v3=v3)][]
#   v_key          v1        v2          v3
#1:     1 0.141804303 0.1311052 0.354798849
#2:     2 0.425955903 0.3635612 0.950234261
#3:     3 0.001070379 0.4615936 0.359660693
#4:     4 0.453054854 0.5768500 0.008470552
#5:     5 0.951767837 0.1649903 0.565894298
Run Code Online (Sandbox Code Playgroud)

简而言之,我想提高第二个示例的效率(没有无用的副本),而不必在中指定每个列名b

我想我可以找到结合使用colnames()get()函数的方法,但是我想知道是否有更简洁的方法,语法对我来说是如此重要。

Jea*_*lie 6

当你写的组合colnamesmget可以让你那里。

考虑一下:

# retrieve the column names from b - without the key ('v_key')
thecols = setdiff(colnames(b), key(b))

# assign them to a
a[b, (thecols) := mget(thecols)]
Run Code Online (Sandbox Code Playgroud)

看起来还不错,不是吗?

此外,我认为目前还没有实现另一种语法data.table。但是我很高兴被证明是错误的:)