在R中计算前三个值的移动平均数

16
在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

我希望能够通过平均第四行前3个值来完成相同的工作。 这在第三列中显示。 有人可以告诉我将有助于实现这一点的函数名称吗?


3
你可以使用 filter(x,rep(1/3,3),sides=1) 进行过滤操作。 - rinni
3个回答

23
您可以使用rollmean,但需要将align='right'设置为右对齐。或者您可以使用rollmeanr,其默认值为align='right'

ma3 <- rollmeanr(x[,1],3,fill=NA)

......但你仍然需要延迟结果。另一个解决方案是使用rollapply函数,将一个列表作为width参数:

ma3 <- rollapplyr(x[,1],list(-(3:1)),mean,fill=NA)

你能解释一下你所说的“...但你仍然需要滞后结果”的意思吗?谢谢。 - CyG
他们想要第四行中的前三个数值。ma3中的每个观测包含当前行和前两行的平均值。所以ma3的第四行包含了第2、3、4行的平均值,而不是他们想要的第1、2、3行的平均值。 - undefined

12

我曾经苦苦搜索一个简单的移动平均函数,能够灵活地满足我的需求。最终,我写了几个函数,扩展了基于过滤函数的那个函数(rinni在评论中提供的函数),但这个函数本身不起作用,因为它会把当前观察值包含在3个期间的平均值中。

  1. Moving average function that includes the current observation

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. Moving average function that does not include the current observation

    mavback <- function(x,n){
      a<-mav(x,1)
      b<-mav(x,(n+1))
      c<-(1/n)*((n+1)*b - a)
      return(c)
    }
    
  3. Backward looking moving average function, not including current obs, based on [h2] readings starting [h1] periods back

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

3

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

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


2
如果您正在使用dplyr,请确保显式调用stats :: filter以进行过滤。 - H5470

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接