Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:使用data.table时,当我使用x[y]时,如何获得y列?_R_Data.table - Fatal编程技术网

R:使用data.table时,当我使用x[y]时,如何获得y列?

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)

更新:旧问题。。。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)
> 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