一系列数据开头的滚动方式和应用方式
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)
我想对数据集中前 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)