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

时间:2011-01-21 22:21:42

标签: r data.table

更新 :旧问题...... 2011年2月,data.table v1.5.3解决了这个问题。

我正在尝试使用data.table软件包,并且非常喜欢我获得的加速,但是当x[y, <expr>] x和{{1} y时,我对此错误感到困惑具有相同密钥的“数据表”,<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

... UPDATE 为了澄清我在上面的例子中寻找的功能:我需要做相当于以下的事情:

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

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

  

最后,虽然看起来好像   x [y]不返回y中的列,   你实际上可以使用来自的列   y在j表达式中。这就是我们   表示加入继承范围。为什么不   只要归还所有的联盟   从x和y开始的列然后运行   表达式?归结为   代码的效率和更快的代码   编程。当你写作   x [y,foo boo],data.table自动   检查j表达式以查看哪个   它使用的列。它只会子集,   或组,仅限那些列。记忆   仅为j的列创建   使用。假设foo在x和嘘   在y(以及其他20列)   在y)。不是x [y,foo boo]更快   程序比运行更快   合并步骤后跟另一个子集   一步?

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

更新:我在数据表帮助邮件列表和软件包作者(Matthew Dowle)replied上询问上面引用的FAQ确实是错误的,所以我使用的语法目前不起作用,即我当我执行y时,无法引用j(即第二个)参数中的x[y,...]列。

1 个答案:

答案 0 :(得分: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 列。如果您想要 x foo 乘以 y boo ,请尝试:

> 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)]。要计算xy$foo * xy$boo中的单列data.table,以下内容可能有效:

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

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


更新(29/03/2012):感谢@David将我的注意力集中在以上示例中使用merge.data.table这一事实。