14

更新:老问题......它已在 2011 年 2 月由 data.table v1.5.3 解决。

我正在尝试使用该data.table软件包,并且真的很喜欢我得到的加速,但是当我使用相同的键执行x[y, <expr>]wherexyare “数据表”时,我被这个错误难住了,并且<expr>包含两个x和的列名y

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

更新...为了澄清我在上面的示例中寻找的功能:我需要执行以下等效操作:

with(merge(x,y), foo*boo)

但是,根据常见问题解答中的以下摘录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] 不是比合并步骤后跟另一个子集步骤更快地编程和运行吗?

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

更新:我在数据表帮助邮件列表中询问,包作者(Matthew Dowle)回答确实上面引用的常见问题解答是错误的,所以我使用的语法目前不起作用,即我无法引用(即第二个)我这样做时的论点。yjx[y,...]

4

1 回答 1

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

在这里,您将返回y的列乘以x的a列。如果你想得到xfoo乘以yboo,试试:

> y[,x*boo]
     foo  a
[1,]  10 50
[2,]  22 44
[3,]  36 36
[4,]  52 26
[5,]  70 14

编辑后:谢谢@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)

因此,每个 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 

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

> 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

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

> xy[,foo*boo]
[1] 10 22 36 52 70

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


更新(2012 年 3 月 29 日):感谢 @David 让我注意到merge.data.table上述示例中使用的事实。

于 2011-01-22T00:05:16.303 回答