gpt4 book ai didi

r - 通过引用合并 data.table 中的所有列

转载 作者:行者123 更新时间:2023-12-04 17:43:42 25 4
gpt4 key购买 nike

我想合并两个 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

我想复制 b 的每一列进入 a通过引用而不指定列名。

我可以执行以下操作,但这会无缘无故地复制对象,从而降低程序的性能并增加所需的 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

另一种选择(没有无用的副本)是指定 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

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

我想我可以找到一种使用 colnames() 的组合来做到这一点的方法。和 get()函数,但我想知道是否有更简洁的方法来做到这一点,语法对我来说非常重要。

最佳答案

正如您所写,colnames 的组合和 mget可以带你到那里。

考虑一下:

# 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)]

这也不算太难看吧?

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

关于r - 通过引用合并 data.table 中的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com