更新 :旧问题...... 2011年2月,data.table v1.5.3解决了这个问题。
我正在尝试使用data.table
软件包,并且非常喜欢我获得的加速,但是当x[y, <expr>]
x
和{{1} 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
... 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,...]
列。
答案 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
这一事实。