从固定起点(和按组)的滚动平均值

时间:2015-10-14 10:54:52

标签: r function moving-average

假设您有以下数据框:

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)

我想计算每个行的Pts平均值是什么,按个人计算,但只包括最早日期和当前行日期之间的条目。

例如:

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正在处理的行进行更改。

我可以使用哪些代码生成我正在寻找的滚动方式?

2 个答案:

答案 0 :(得分:3)

您可以尝试:

library(data.table)

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

答案 1 :(得分:2)

以下是一些替代方案:

1)这不使用任何包:

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

2)另一种方法是使用带有宽度向量的zoo rollmeanr

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