从固定起点(和按组)开始的滚动平均值
Rolling Mean from fixed starting point (and by Group)
假设您有以下数据框:
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 正在处理的行进行更改。
我可以使用什么代码来生成我正在寻找的 Rolling Means?
你可以试试:
library(data.table)
setDT(df)[,cumsum(Pts[order(Date)])/seq(.N), Individual]
这里有几个备选方案:
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)
假设您有以下数据框:
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 正在处理的行进行更改。
我可以使用什么代码来生成我正在寻找的 Rolling Means?
你可以试试:
library(data.table)
setDT(df)[,cumsum(Pts[order(Date)])/seq(.N), Individual]
这里有几个备选方案:
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)