3

私はR初心者なので、うまくいけば、これはあなたの何人かにとって解決可能な問題です。100万を超えるデータポイントを含むデータフレームがあります。私の目標は、開始点を変更して加重平均を計算することです。

説明のために、このフレームを検討してください(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はサンプリングの重みです。

X1の加重平均を開始点1から3、2:3、3:3で計算したいと思います。

ループで私は単に書いた:

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コマンドを使用してさまざまな開始点を実装する方法はありますか?

よろしく、ルーベン

4

2 に答える 2

3

@joranの答えに基づいて、正しい結果を生成します。

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

また、これは/アプローチよりもはるかに高速であることに注意してください。sapplylapply

于 2012-03-07T21:53:08.487 に答える
1

lapplyサブセットを作成し、これらをループするために使用できますsapplyが、もっと速い方法があると思います。

sapply(lapply(1:3,":",3),function(x) with(dat[x,],weighted.mean(X1,X2)))
[1] 1.800000 2.333333 3.000000
于 2012-03-07T20:41:01.797 に答える