2016-11-28 7 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

'дт [, VWA: = cumsum (Цена)/(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

Отлично! Именно то, что я искал. Да, 'Position' содержит уникальные значения и сортируется. Я фактически использовал 'cumsum' раньше, но только на чистых суммах. Имеет смысл просто применить его к произведению двух векторов. Спасибо за это! – schluk5