我想对数据集中前4个值进行滚动平均。但是,一开始,由于没有4个值,我想做1/2/3观测的滚动平均值。我该怎么做?
library(zoo)
df= data.frame(a=c(1,2,3,4,5))
df$answer = rollapply(df$a, 4,mean)
#help
例如,第1行的值为1,第2行的值为(1 + 2)/2=1.5,第3行的值为6/3 = 2.
我想做4个时期的滚动方式,但是在月数较少的时期,我想做允许的最大时段的平均值。
答案 0 :(得分:7)
与partial=TRUE
,o.r使用右对齐。 rollapplyr(..., partial=TRUE)
或rollapply(..., align = "right", partial=TRUE
)。我们在这里使用rollapplyr
:
rollapplyr(df$a, 4, mean, partial = TRUE)
答案 1 :(得分:3)
您也可以尝试不带包装:
sapply(seq_along(df$a), function(u) mean(df$a[max(u-3,0):u]))
#[1] 1.0 1.5 2.0 2.5 3.5
或矢量化解决方案 - 没有循环 - 基础R
:
with(df, (cumsum(a) - c(rep(0,4),head(a,-4)))/pmin(seq_along(a),4))
#[1] 1.0 1.5 2.0 2.5 3.5
答案 2 :(得分:3)
我认为可以通过简单的功能完成,例如以下(作为替代解决方案):
rollapply2 <- function(myvec, width, fun){
#the first values up to width
firstvalues <- cumsum(myvec[1:(width-1)])/(1:(width-1))
#the rest of the values as normal
normalvalues <- rollapply(myvec, width, fun)
#return them all
c(firstvalues,normalvalues)
}
输出:
> rollapply2(df$a, 4, mean)
[1] 1.0 1.5 2.0 2.5 3.5
答案 3 :(得分:1)
如何添加额外的NA?
rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)