即';右';与';左';R中的滚动平均值?

即';右';与';左';R中的滚动平均值?,r,mean,moving-average,rolling-computation,R,Mean,Moving Average,Rolling Computation,如果我想计算前一个n平均年份与当前年份的滞后,我将如何实现这一点?它是否像“正确”的滚动窗口一样简单?还是一个“左”的滚动窗口?我不确定这里用哪个窗口 样本数据 set.seed(1234) dat <- data.frame(year = c(1990:2010), x = rnorm(21)) dat$x_lag1 <- lag(dat$x, 1) set.seed(1234) 答案是dat简而言之align=“right”。align指定

如果我想计算前一个
n
平均年份与当前年份的滞后,我将如何实现这一点?它是否像“正确”的滚动窗口一样简单?还是一个“左”的滚动窗口?我不确定这里用哪个窗口

样本数据

set.seed(1234)
dat <- data.frame(year = c(1990:2010), 
                  x = rnorm(21))
dat$x_lag1 <- lag(dat$x, 1)
set.seed(1234)

答案是dat简而言之
align=“right”
align
指定结果索引与滚动观察窗口相比是否左/中/右对齐。如果
width=3,align=“right”
则从左到右的两个观测值将与当前观测值一起传递到
FUN
计算当前观测值索引处的值

可以使用滚动的
lag
align=“right”
)平均值来获得先前
n
观测值(不包括当前观测值)的
平均值。下面的答案基于
zoo::rollapply
,它计算了过去
5年
mean

set.seed(1)
dat <- data.frame(year = c(1990:2010), 
                  x = rnorm(21))

library(dplyr)
library(zoo)
#Mean for previous 5 years can be calculated as:

dat$meanx <- lag(rollapply(dat$x, 5, mean, align = "right", fill=NA))

#Test result
dat[1:10,]
# year          x      meanx
# 1  1990 -0.6264538         NA
# 2  1991  0.1836433         NA
# 3  1992 -0.8356286         NA
# 4  1993  1.5952808         NA
# 5  1994  0.3295078         NA
# 6  1995 -0.8204684 0.12926990
# 7  1996  0.4874291 0.09046698
# 8  1997  0.7383247 0.15122413
# 9  1998  0.5757814 0.46601479
# 10 1999 -0.3053884 0.26211490
# so on
set.seed(1)

dat从偏移角度考虑可能更容易。如果你想要3个窗口,那么

  • align=“right”
    对应于使用基于偏移量-2、-1、0的窗口,即前一点、前一点和当前点之前的点。当前点是窗口的最右端。请注意,末尾带有
    r
    rollappyr
    与指定
    align=“right”
  • align=“center”
    对应于使用基于-1、0、1偏移的窗口,即前一点当前点和下一点。当前点是窗口的中心。这是
    align=
    的默认值
  • align=“left”
    对应于使用基于偏移量0、1、2的窗口,即当前点、下一点和之后的点。当前点是窗口的最左侧点
rollappy
允许使用
align=
规格或偏移符号。要将后者用于宽度,请指定一个包含定义偏移的单个向量的列表。(宽度的实际指定是指定一个宽度向量,一个用于输入的每个元素或偏移向量列表;但是,在这两种情况下,它们都是循环的,因此指定单个标量宽度或包含单个偏移向量的列表的通常情况是特定情况。)

以当前点结束的窗口 下面我们使用
align=
获取以当前点结束的3个窗口的平均值,并使用偏移作为替代。我们同时显示数据帧和zoo对象

我们省略了zoo对象的
fill=NA
,因为它们会自动对齐,因此通常不需要使用它

library(zoo)

r1 <- transform(dat, roll = rollapplyr(x, 3, mean, fill = NA))

r2 <- transform(dat, roll = rollapply(x, list(seq(-2, 0)), mean, fill = NA))

all.equal(r1, r2)
## [1] TRUE

z <- read.zoo(dat, FUN = identity)
r3 <- rollapplyr(z, 3, mean)

r4 <- rollmeanr(z, 3)

r5 <- rollapply(z, list(seq(-2, 0)), mean) # z from above

all.equal(r3, r4, r5)
## [1] TRUE

这肯定是一个重复,请关闭作为重复没有明显的重复,我看到…伟大的答案!谢谢,回答得很好。非常感谢。不要使用
lag
而是使用
rollappy(x,5,list(-seq(5)),mean,fill=NA)
。i、 e.指定偏移量-1、-2、-3、-4、-5。
# r6 is data frame
r6 <- transform(dat, roll = rollapply(x, list(-seq(3)), mean, fill = NA))

# r7, r8, r9 are zoo objects

r7 <- rollapply(z, list(-seq(3)), mean) # z from above

r8 <- stats::lag(rollapplyr(z, 3, mean), -1)

r9 <- stats::lag(rollmeanr(z, 3), -1)

all.equal(r7, r8, r9)
## [1] TRUE