R:使用data.table时如何在x [y]时得到y的列?

Pra*_*ani 14 r data.table

更新:旧问题......它是由2011年2月的data.table v1.5.3解决的.

我试图用data.table包,真的很喜欢加速比我得到的,但我对这个错误难倒当我x[y, <expr>]在那里xy是"数据表"使用相同的密钥,并且<expr>同时包含的列名xy:

require(data.table)
x <- data.table( foo = 1:5, a = 5:1 )
y <- data.table( foo = 1:5, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
> x[y, foo*boo]
Error in eval(expr, envir, enclos) : object 'boo' not found
Run Code Online (Sandbox Code Playgroud)

更新...为了阐明我在上面的例子中寻找的功能:我需要做相当于以下的事情:

with(merge(x,y), foo*boo)
Run Code Online (Sandbox Code Playgroud)

但是根据data.table常见问题解答中的以下摘录,这应该有效:

最后,虽然看起来好像x [y]不返回y中的列,但实际上可以使用j表达式中y的列.这就是我们所说的连接继承范围.为什么不直接从x和y返回所有列的并集,然后在其上运行表达式?它归结为代码的效率和更快的编程.当您编写x [y,foo boo]时,data.table会自动检查j表达式以查看它使用的列.它只会对这些列进行子集或分组.仅为j使用的列创建内存.假设foo在x中,而boo在y中(与y中的20个其他列一起).是不是x [y,foo boo]比合并步骤更快的编程和更快的运行,然后是另一个子集步骤?

我知道这个问题解决了类似问题,但似乎没有得到令人满意的解决.有人知道我错过了什么或误解了吗?谢谢.

更新:我问的数据表帮助邮件列表和包的作者(马修Dowle)上,确实上面引述的常见问题是错误的,所以我使用的语法不会与目前的工作,即我不能指y列在j(即第二次)我的论点x[y,...].

dar*_*zig 4

我不确定我是否很好地理解了这个问题,而且我也刚刚开始阅读data.table库的文档,但我想如果您想获取y的列并对a的列进行一些操作,你可以尝试这样的事情:

> x[y,a*y]
     foo boo
[1,]   5  50
[2,]   8  44
[3,]   9  36
[4,]   8  26
[5,]   5  14
Run Code Online (Sandbox Code Playgroud)

在这里,您将得到y的列乘以xa列。如果你想得到xfoo乘以yboo,请尝试:

> y[,x*boo]
     foo  a
[1,]  10 50
[2,]  22 44
[3,]  36 36
[4,]  52 26
[5,]  70 14
Run Code Online (Sandbox Code Playgroud)

编辑后:谢谢@Prasad Chalasani,让我的问题更加清晰。

如果首选简单合并,那么以下方法应该可行。我制作了一个更复杂的数据来更深入地了解操作:

x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
Run Code Online (Sandbox Code Playgroud)

因此,每个 data.table 中只添加了一个额外的列。让我们看看merge并使用data.tables

> system.time(merge(x,y))
   user  system elapsed 
  0.027   0.000   0.023 
> system.time(x[,list(y,x)])
   user  system elapsed 
  0.003   0.000   0.006 
Run Code Online (Sandbox Code Playgroud)

由此看来后者要快得多。虽然结果并不相同,但可以以相同的方式使用(带有后一运行的额外列):

> merge(x,y)
     foo  a zoo  b boo
[1,]   1 20   5 30  10
[2,]   2 21   4 31  11
[3,]   3 22   3 32  12
[4,]   4 23   2 33  13
[5,]   5 24   1 34  14
> x[,list(x,y)]
     foo  a zoo foo.1  b boo
[1,]   1 20   5     1 30  10
[2,]   2 21   4     2 31  11
[3,]   3 22   3     3 32  12
[4,]   4 23   2     4 33  13
[5,]   5 24   1     5 34  14
Run Code Online (Sandbox Code Playgroud)

所以为了得到xy我们可以使用:xy <- x[,list(x,y)]。要从 计算一列 data.table xy$foo * xy$boo,以下方法可能有效:

> xy[,foo*boo]
[1] 10 22 36 52 70
Run Code Online (Sandbox Code Playgroud)

好吧,结果不是 data.table 而是向量。


更新(29/03/2012):merge.data.table感谢@David 指出我对上述示例中使用的事实的关注。

  • 2011 年 2 月发布到 CRAN 的 v1.5.3 解决了这个问题。请参阅它的新闻、新的 ?data.table 和更正的常见问题解答。 (2认同)