2016-11-28 8 views
2

根拠では、次のデータテーブルである:R:累積加重平均data.table

library(data.table) 
dt <- data.table(Position = 1:3, Price = c(50, 45, 40), Volume = c(10, 10, 10)) 

dt 
    Position Price Volume 
1:  1 50  10 
2:  2 45  10 
3:  3 40  10 

今私は、アカウントにすべてのポジション"<="現在位置を取って、各位置の加重平均値を計算したいと思います。結果は次のようになります:

dt[, Vwa := c(50, 47.5, 45)] 

dt 
    Position Price Volume Vwa 
1:  1 50  10 50.0 
2:  2 45  10 47.5 
3:  3 40  10 45.0 

これを効率的に達成する方法はありますか?

+1

'dt [、Vwa:= cumsum(Price)/(1:.N)]'? –

答えて

4

Positionの列には一意の値が含まれていて、これを前もってソートしていると仮定すると、加重平均の定義に基づいて計算することができます。 Volumeが重み係数の場合:

dt[, Vwa := cumsum(Price * Volume)/cumsum(Volume)] 
dt 
# Position Price Volume Vwa 
#1:  1 50  10 50.0 
#2:  2 45  10 47.5 
#3:  3 40  10 45.0 
+1

素晴らしい!まさに、私が探していたもの。はい、「位置」には一意の値が含まれ、並べ替えられます。私は実際には前に 'cumsum'を使っていましたが、純粋な和にしました。 2つのベクトルの積に適用するだけで意味があります。ありがとう! – schluk5