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

Любая идея, как сделать это эффективно?


person schluk5    schedule 28.11.2016    source источник


Ответы (1)


Предполагая, что ваш столбец 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
person Psidom    schedule 28.11.2016
comment
Большой! Именно то, что я искал. Да, Position содержит уникальные значения и отсортировано. Раньше я использовал cumsum, но только на чистых суммах. Имеет смысл просто применить его к произведению двух векторов. Спасибо за это! - person schluk5; 28.11.2016