使用apply替换for循环以提高性能(使用weighted.mean)

时间:2012-03-07 19:56:45

标签: r for-loop apply weighted-average

我是R新手,所以希望这对你们中的一些人来说是一个可以解决的问题。 我有一个包含超过一百万个数据点的数据帧。我的目标是计算一个带有改变起点的加权平均值。

为了说明这个框架(data.frame(matrix(c(1,2,3,2,2,1),3,2)))

  X1 X2
1  1  2
2  2  2
3  3  1

其中X1是数据,X2是采样权重。

我想从起点1到3,从2:3和3:3计算X1的加权平均值。

通过循环,我只写了:

B <- rep(NA,3) #empty result vector
for(i in 1:3){
  B[i] <- weighted.mean(x=A$X1[i:3],w=A$X2[i:3]) #shifting the starting point of the data and weights further to the end
} 

使用我的真实数据,这是不可能计算的,因为对于每次迭代,data.frame都会被更改,并且计算需要数小时而没有结果。

有没有办法用apply命令实现变量起点,以便性能提高?

的问候, 鲁

2 个答案:

答案 0 :(得分:3)

在@joran的答案基础上建立正确的结果:

with(A, rev(cumsum(rev(X1*X2)) / cumsum(rev(X2))))
# [1] 1.800000 2.333333 3.000000

另请注意,这比<{1}} / sapply方法 快。

答案 1 :(得分:1)

您可以使用lapply来创建子集,并使用sapply来覆盖这些子集,但我会打赌会有更快的方式。

sapply(lapply(1:3,":",3),function(x) with(dat[x,],weighted.mean(X1,X2)))
[1] 1.800000 2.333333 3.000000