gpt4 book ai didi

r - data.table join 然后将列添加到现有的 data.frame 中,无需重新复制

转载 作者:行者123 更新时间:2023-12-03 01:37:34 25 4
gpt4 key购买 nike

我有两个data.tables 、X(3m 行 x 约 500 列)和 Y(100 行 x 两列)。

set.seed(1)
X <- data.table( a=letters, b=letters, c=letters, g=sample(c(1:5,7),length(letters),replace=TRUE), key="g" )
Y <- data.table( z=runif(6), g=1:6, key="g" )

我想在 X 上进行左外连接,我可以通过 Y[X] 来完成感谢:

Why does X[Y] join of data.tables not allow a full outer join, or a left join?

但我想将新列添加到 X 没有复制 X (因为它很大)。

显然,类似于 X <- Y[X]有效,但除非 data.table比我认为的要聪明得多(我认为它有很多狡猾之处!),我相信这复制了整个 X .

X[ , z:= Y[X,z]$z ]可行,但很笨拙,并且不能很好地扩展到多于一列。

如何以有效的方式(无论是在副本方面还是在程序员时间方面)将合并结果存储回保留的 data.table 中?

最佳答案

这很容易做到:

X[Y, z := i.z]

它之所以有效,是因为 Y[X]X[Y] 之间的唯一区别是某些元素不在 Y 中,在这种情况下,您可能希望 zNA,上面的赋值完全可以做到这一点。

它对于许多变量也同样有效:

X[Y, `:=`(z1 = i.z1, z2 = i.z2, ...)]
<小时/>

由于您需要操作Y[X],因此您可以添加参数nomatch=0(正如@mnel指出的那样),以免获得这些操作的NA其中 X 不包含 Y 中的键值。即:

X[Y, z := i.z, nomatch=0]
<小时/>

来自NEWS for data.table

    **********************************************
** **
** CHANGES IN DATA.TABLE VERSION 1.7.10 **
** **
**********************************************

NEW FEATURES

o   The prefix i. can now be used in j to refer to join inherited
columns of i that are otherwise masked by columns in x with
the same name.

关于r - data.table join 然后将列添加到现有的 data.frame 中,无需重新复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19553005/

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