一系列数据开头的滚动方式和应用方式

Rolling means and applying means at beginning of a series of data

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

你也可以不加包试试:

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

添加额外的 NA 怎么样?

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)

我认为这可以通过一个简单的函数来完成,例如以下(作为替代解决方案):

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

使用 partial=TRUE 的右对齐,o.r. rollapplyr(..., partial=TRUE)rollapply(..., align = "right", partial=TRUE)。这里我们使用 rollapplyr:

rollapplyr(df$a, 4, mean, partial = TRUE)