假设您有以下数据框:
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正在处理的行进行更改。
我可以使用哪些代码生成我正在寻找的滚动方式?
答案 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)