data.table行引用行为

时间:2014-06-05 21:58:15

标签: r data.table

我对以下data.table行为感到困惑。

设置可重复的示例

iris <- data.table(iris)[1:10]
iris[,row.ord:=.I]

为什么这样:

iris[,Val1:=Sepal.Length[row.ord]+Sepal.Length[row.ord+1]]

与此相比给出了不同的结果:

iris[,Val2:=sum(Sepal.Length[row.ord:(row.ord+1)])]
#Warning messages:
#1: In row.ord:(row.ord + 1) :
#  numerical expression has 10 elements: only the first used
#2: In row.ord:(row.ord + 1) :
#  numerical expression has 10 elements: only the first used

结果

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species row.ord Val Val1 Val2
 1:          5.1         3.5          1.4         0.2  setosa       1 5.1 10.0   10
 2:          4.9         3.0          1.4         0.2  setosa       2 4.9  9.6   10
 3:          4.7         3.2          1.3         0.2  setosa       3 5.1  9.3   10
 4:          4.6         3.1          1.5         0.2  setosa       4 4.9  9.6   10
 5:          5.0         3.6          1.4         0.2  setosa       5 5.1 10.4   10
 6:          5.4         3.9          1.7         0.4  setosa       6 4.9 10.0   10
 7:          4.6         3.4          1.4         0.3  setosa       7 5.1  9.6   10
 8:          5.0         3.4          1.5         0.2  setosa       8 4.9  9.4   10
 9:          4.4         2.9          1.4         0.2  setosa       9 5.1  9.3   10
10:          4.9         3.1          1.5         0.1  setosa      10 4.9   NA   10

2 个答案:

答案 0 :(得分:3)

评论的主要原因是: sum,没有矢量化。向量化它的一种经典方法是使用mapply

iris[, Val2:=mapply(sum,Sepal.Length[row.ord],Sepal.Length[row.ord+1])]

现在Val1和Val2相等:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species row.ord Val1 Val2
 1:          5.1         3.5          1.4         0.2  setosa       1 10.0 10.0
 2:          4.9         3.0          1.4         0.2  setosa       2  9.6  9.6
 3:          4.7         3.2          1.3         0.2  setosa       3  9.3  9.3
 4:          4.6         3.1          1.5         0.2  setosa       4  9.6  9.6
 5:          5.0         3.6          1.4         0.2  setosa       5 10.4 10.4
 6:          5.4         3.9          1.7         0.4  setosa       6 10.0 10.0
 7:          4.6         3.4          1.4         0.3  setosa       7  9.6  9.6
 8:          5.0         3.4          1.5         0.2  setosa       8  9.4  9.4
 9:          4.4         2.9          1.4         0.2  setosa       9  9.3  9.3
10:          4.9         3.1          1.5         0.1  setosa      10   NA   NA

PS:This question可以帮助您更好地理解&#34;矢量化&#34;方面。

OP评论后编辑:

看起来OP正在寻找向前滚动的总和。

library(zoo)
iris[,valr := rollapplyr(Sepal.Length,5,sum)]

答案 1 :(得分:0)

看起来你正在使用总和来包含元素数:

iris[,Val2:=sum(Sepal.Length[row.ord:(row.ord+1)])]

您需要提取元素,而不仅仅是获取计数。