2015-10-14 2 views
3

Предположим, у вас есть следующий кадр данных:прокатки среднее от фиксированной начальной точки (и группы)

set.seed(100) 
Pts <- floor(runif(20, 0, 10)) 
Individual <- c(rep("Adam",5), rep("Ben",5), rep("Charlie",5), rep("Daisy",5)) 
Date <- c(rep(seq(as.Date("2015-01-01"), as.Date("2015-01-05"), "days"), 4)) 
RollMean <- rep(NA,20) 

df <- data.frame(Pts, Individual, Date, RollMean) 

Я хотел бы, чтобы вычислить, что средние RollMean для КОЗ для каждой строки, отдельными, но включая записи между самой ранней датой и датой в текущей строке.

Например:

df$RollMean[3] = (5+2+3)/3 
df$RollMean[4] = (5+2+3+0)/4 
df$RollMean[7] = (8+4)/2 

Я попытался с помощью таких функций, как SMA() из TTR пакета, а затем используя ave для сортировки группы, такие как:

df$RollMean <- ave(df$Pts, df$Individual, FUN= function(x) SMA(x, n)) 

, но там я должен предварительно указать n, который изменяется в зависимости от того, с чем связана строка R.

Какой код я могу использовать для создания Rolling Means, который я ищу?

ответ

3

Вы можете попробовать:

library(data.table) 

setDT(df)[,cumsum(Pts[order(Date)])/seq(.N), Individual] 
+0

Большое спасибо, это отлично работает. Если бы я хотел использовать некоторые из более сложных функций скользящего среднего в TTR, таких как EMA() и WMA(), есть ли способ их включения без ручной имитации/разрушения этих вычислений? –

2

Вот несколько альтернатив:

1) Это не использует какие-либо пакеты:

transform(df, Rollmean = ave(Pts, Individual, FUN = function(x) cumsum(x)/seq_along(x))) 

2) Альтернатива для использования zoo's rollmeanr с вектором ширины:

library(zoo) 
Rollmean <- function(x) rollapplyr(x, seq_along(x), mean)) 
transform(df, Rollmean = ave(Pts, Individual, FUN = Rollmean) 
Смежные вопросы