我对以下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
答案 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正在寻找向前滚动的总和。
library(zoo)
iris[,valr := rollapplyr(Sepal.Length,5,sum)]
答案 1 :(得分:0)
看起来你正在使用总和来包含元素数:
iris[,Val2:=sum(Sepal.Length[row.ord:(row.ord+1)])]
您需要提取元素,而不仅仅是获取计数。