2011-01-21 52 views
13

UPDATE:老问题...它是由data.table V1.5.3在二月得到解决2011年R:使用data.table的时候如何在我做x [y]的时候得到y的列?

我试图使用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 

UPDA TE ... 为了澄清我要寻找一个在上面的例子中的功能:我需要做下面的等价:

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

然而,根据从data.table FAQ下面的摘录,这应该有工作:

最后,虽然它看起来好像 X [Y]不以y返回列, 实际上你可以在J表达式中使用的列从 年。这就是我们 所说的加入继承范围。为什么不 只是返回从x和y所有 列的联合,然后运行 表达式?它归结为 代码的有效性以及编程的更快速的 。当您编写 x [y,foo boo]时,data.table会自动检查j表达式以查看它使用哪个列。它只会成为子集, 或组,只有那些列。仅为j 使用的列创建内存 。假设foo在x中,并且boo 在y中(以及y中的其他20列 )。是不是x [y,foo boo]更快到 程序和更快运行比 合并步骤其次子集 步骤?

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

更新:我问了关于数据表帮助邮件列表和包作者(马修Dowle)replied确实上面引用的FAQ是错误的,所以我使用的语法目前不会工作,即我不能参考当我做x[y,...]时,j(即第二个)参数中的y列。

+0

但是你问前一段时间,它是由在2011年二月发布到CRAN V1.5.3解决请看看它的消息,新的?data.table和纠正常见问题。 – 2011-03-24 12:34:29

+0

@Matthew谢谢你,是的,我知道它已经被最新的版本中解决了,我很高兴你指出来这里,所以很明显给他人。 – 2011-03-24 14:06:24

回答

4

我不确定我是否很好地理解了这个问题,而且我也刚开始阅读数据的文档。表库,但我想,如果你想获得的Ÿ列,并做一些事情来那些由一个列,你可以尝试这样的:

> x[y,a*y] 
    foo boo 
[1,] 5 50 
[2,] 8 44 
[3,] 9 36 
[4,] 8 26 
[5,] 5 14 

在这里,你会得到备份ÿ乘以的X一个列的列。如果你想获得X乘以Ÿ嘘声,尝试:

> 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。让我们来看看mergedata.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而是矢量来代替。


更新(29/03/2012):感谢@大卫的指点我注意的是merge.data.table是在上面的例子中使用的事实。

相关问题