Moving average with changing period in R

三世轮回 提交于 2019-12-13 02:28:04

问题


I have a data frame named abc on which I'm doing moving average using rollapply. The following code works:

forecast <- rollapply(abc, width=12, FUN=mean, align = "right", fill=NA)

Now, I want to do the same thing with the width being variable, i.e. for the 1st month, it'll be empty, for the second month, first month's value will come. For the third month, it'll be (first month+second month/2), i.e. for the ith month, if i<=12, the value will be (sum(1:i-1)/(i-1)) and for i>=12 it will be the average of the last 12 months as done by the forecast. Please help.


回答1:


Here are some appraoches:

1) partial=TRUE

n <- length(x)
c(NA, rollapplyr(x, 12, mean, partial = TRUE)[-n])

Note the r at the end of rollapplyr.

2) width as list The width argument of rollapply can be a list such that the ith list element is a vector of the offsets to use for the ith rolling computation. If we specify partial=TRUE then offsets that run off the end of the vector will be ignored. If we only specify one element in the list it will be recycled:

rollapply(x, list(-seq(12)), mean, partial = TRUE, fill = NA)

2a) Rather than recycling and depending on partial we can write it out. Here we want width <- list(numeric(0), -1, -(1:2), -(1:3), ..., -(1:12), ..., -(1:12)) which can be calculated like this:

width <- lapply(seq_along(x), function(x) -seq_len(min(12, x-1)))
rollapply(x, width, mean)

This one would mainly be of interest if you want to modify the specification slightly because it is very flexible.

Note: Later in the comments the poster asked for the same rolling average except for it not to be lagged. That would be just:

rollapplyr(x, 12, mean, partial = TRUE)

Note the r at the end of rollapplyr.

Update Some improvements and additional solutions.



来源:https://stackoverflow.com/questions/24628708/moving-average-with-changing-period-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!