2015-10-14 36 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 <- ave(df$Pts, df$Individual, FUN= function(x) SMA(x, n)) 

但我不得不:

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

我已經使用的功能,例如SMA()TTR包,然後使用ave由組進行排序,如試過預先指定n,其基於哪個行R正在處理而改變。

我可以用什麼代碼來生成滾動手段我在找什麼?

回答

3

你可以試試:

library(data.table) 

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

非常感謝,這個作品很棒。如果我想使用ETR()和WMA()等TTR中更復雜的移動平均函數,是否有一種方法可以在不手動模擬/分解這些計算的情況下合併這些函數? –

2

這裏有幾個選擇:

1)這不使用任何套餐:

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

2)另一種方法是使用寬度爲向量的動物園的rollmeanr

library(zoo) 
Rollmean <- function(x) rollapplyr(x, seq_along(x), mean)) 
transform(df, Rollmean = ave(Pts, Individual, FUN = Rollmean)