R中前三个值的移动平均值

Joc*_*hem 11 r moving-average zoo

在动物园包中有一个名为rollmean的函数,它可以让你移动平均值.所述rollmean(x,3)将采取先前,当前和下一值(即4,6和2)在下面的表中.这显示在第二列中.

x   rollmean    ma3
4       
6   4.0 
2   4.3 
5   3.0         4.0
2   6.3         4.3
12  6.0         3.0
4   6.0         6.3
2               6.0
Run Code Online (Sandbox Code Playgroud)

我想完成相同的工作,但是通过平均排除第四行中的前三个值.这显示在第三列中.谁能告诉我有助于实现这一目标的功能名称?

Jos*_*ich 16

你可以使用rollmean,但设置align='right'.或者你可以使用rollmeanr,它有align='right'默认值.

ma3 <- rollmeanr(x[,1],3,fill=NA)
Run Code Online (Sandbox Code Playgroud)

...但你仍然需要滞后于结果.另一种解决方案是使用参数rollapply列表width:

ma3 <- rollapplyr(x[,1],list(-(3:1)),mean,fill=NA)
Run Code Online (Sandbox Code Playgroud)


小智 5

我一直在努力寻找一种简单的移动平均值函数,该函数具有一定的灵活性来执行我需要的操作。我最后编写了几个函数,这些函数基于rinni在注释中上面给出的过滤器函数进行了扩展(但是它本身不起作用,因为它将在3个周期平均值中包含当前观测值)。

  1. 包含当前观测值的移动平均函数

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不包含当前观测值的移动平均函数

    mavback <- function(x,n){
      a<-mav(x,1)
      b<-mav(x,(n+1))
      c<-(1/n)*((n+1)*b - a)
      return(c)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 基于[h1]周期开始的[h2]读数的后向移动平均值函数,不包括当前obs

    mavback1<-function(x,h1,h2){
      a<-mavback(x,h1)
      b<-mavback(x,h1-h2)
      c<-(1/h2)*(h1*a -(h1-h2)*b)
      return(c)
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 3

基于 w_i_l_l 的 mav 函数,更简单地实现 w_i_l_l 的 mavback 函数

mavback <- function(x,n){ filter(x, c(0, rep(1/n,n)), sides=1) }

  • 如果您使用 dplyr,请确保调用过滤显式 stats::filter (2认同)