R:使用data.table时,当我使用x[y]时,如何获得y列?
更新:旧问题。。。2011年2月,数据表v1.5.3解决了该问题 我试图使用R:使用data.table时,当我使用x[y]时,如何获得y列?,r,data.table,R,Data.table,更新:旧问题。。。2011年2月,数据表v1.5.3解决了该问题 我试图使用data.table软件包,非常喜欢我得到的加速,但是当我使用x[y,]时,我被这个错误难住了,其中x和y是具有相同键的“数据表”,并且包含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)
data.table
软件包,非常喜欢我得到的加速,但是当我使用x[y,]
时,我被这个错误难住了,其中x
和y
是具有相同键的“数据表”,并且
包含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
但是,根据以下从数据表中摘录的内容,这应该是有效的:
最后,虽然看起来好像
x[y]不返回y中的列,
实际上,您可以使用
j表达式中的y。这就是我们要做的
是指连接继承的作用域。为什么不呢?
只要把所有人的联盟还给我就行了
从x和y中选择列,然后运行
关于那件事?归结起来就是
代码的精确性和什么更快
编程。当你写作时
x[y,fooboo],自动生成data.table
检查j表达式以查看
它使用的列。它只会,
或组,仅限这些列。记忆
仅为j中的列创建
使用。假设foo在x中,boo在x中
是y(以及其他20列)
在y中)。x[y,fooboo]是不是比
程序,运行速度比
合并步骤后跟另一个子集
步
我知道这解决了一个类似的问题,但似乎没有得到令人满意的解决。有人知道我遗漏了什么或误解了什么吗?谢谢
更新:我在数据表帮助邮件列表和软件包作者(Matthew Dowle)中询问,上面引用的FAQ确实是错误的,因此我使用的语法目前不起作用,即当我执行x[y,…]
时,我不能引用j
(即第二个)参数中的y
列 我不确定我是否理解这个问题,我也刚刚开始阅读data.table library的文档,但我认为如果您想获得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,请尝试:
编辑后:谢谢@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)
从这个角度看,后者的速度要快得多。虽然结果不完全相同,但可以以相同的方式使用(后一次运行时有一个额外的列):
因此,为了得到xy
,我们可以使用:xy参考我问题中的例子,我想把x
和y
连接起来,我们称之为xy
,然后创建一个单列数据框,它等于xy$foo*xy$boo
@Prasad Chalasani:我编辑了我的答案,我希望你能从中发现一些新的和有价值的东西。谢谢你提供的详细信息,但我的问题是为什么我在问题中描述的特定语法不起作用,这与常见问题解答中的说法相反。我知道我可以分两个阶段(合并,然后对列进行操作),但我希望x[y,]
语法在一个步骤中起作用,即在一个步骤中对x
和y
列进行连接和操作。这在语法上不那么繁琐,而且可能更快(如果在内部正确实现的话)。我正在处理1000万行数据帧,所以我不关心上面的小玩具示例的计时。@Prasad Chalasani:我明白了,那么我的“答案”似乎是没有答案:(我认为FAQ在这一部分是不正确的,正如@f3lix所建议的。2011年2月发布给CRAN的v1.5.3解决了这一问题。请查看其新闻、新数据表和更正的FAQ。但您不久前提出了问题,2011年2月发布给CRAN的v1.5.3解决了这一问题。请查看其新闻、新数据表和更正的FAQ。@Matthew thank you,是的,我知道最新版本已经解决了这个问题,我很高兴你在这里指出了这一点,让其他人都清楚了。
> y[,x*boo]
foo a
[1,] 10 50
[2,] 22 44
[3,] 36 36
[4,] 52 26
[5,] 70 14
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)
> 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[,foo*boo]
[1] 10 22 36 52 70