Pra*_*ani 14 r data.table
更新:旧问题......它是由2011年2月的data.table v1.5.3解决的.
我试图用data.table包,真的很喜欢加速比我得到的,但我对这个错误难倒当我x[y, <expr>]在那里x和y是"数据表"使用相同的密钥,并且<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
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,...].
我不确定我是否很好地理解了这个问题,而且我也刚刚开始阅读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的列乘以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
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 指出我对上述示例中使用的事实的关注。