滚动装置和应用装置在一系列数据的开头

时间:2015-04-09 19:35:48

标签: r dataframe time-series

我想对数据集中前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个时期的滚动方式,但是在月数较少的时期,我想做允许的最大时段的平均值。

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)