更新:老问题......它已在 2011 年 2 月由 data.table v1.5.3 解决。
我正在尝试使用该data.table
软件包,并且真的很喜欢我得到的加速,但是当我使用相同的键执行x[y, <expr>]
wherex
和y
are “数据表”时,我被这个错误难住了,并且<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)回答说确实上面引用的常见问题解答是错误的,所以我使用的语法目前不起作用,即我无法引用(即第二个)我这样做时的论点。y
j
x[y,...]