从固定起点开始的滚动均值(按组)

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)

我希望能够计算每一行中个人的Pts平均RollMean,但仅包括最早日期和当前行日期之间的条目。
例如:
df$RollMean[3] = (5+2+3)/3
df$RollMean[4] = (5+2+3+0)/4
df$RollMean[7] = (8+4)/2

我尝试使用TTR包中的SMA()等函数,然后使用ave按组进行排序,例如:

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

但是我需要事先指定 n,这取决于正在处理的行R。

有什么代码可以生成我想要的滚动平均值吗?

2个回答

3

你可以尝试:

library(data.table)

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

非常感谢,这个很好用。如果我想在TTR中使用一些更复杂的移动平均函数,比如EMA()和WMA(),有没有一种方法可以将它们整合进来,而不需要手动模拟/分解这些计算? - Will T-E

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接