问题描述
我有一个很长的时间序列变量。我想执行一个窗口大小为 20 的向后移动平均。如果我保持这个窗口大小,那么输出系列将缩短长度 20(我的意思是前 20 个值将是 NA)但我想要的是输出系列应该与非 NA 的原始系列具有相同的长度。为此,我想在开始时改变窗口大小,以便获得所需的输出。例如,对于原始时间序列中的前 20 个值,移动窗口大小可以分别为 1、2、3、....、20。然后我想之后保持20的窗口大小。如何做到这一点?
这是窗口大小为 3 的示例数据和所需的输出:
Days Original_Values Desired_Output
1 2 2
2 4 2
3 1 3
4 3 7/3
5 5 8/3
6 6 9/3
7 4 14/3
8 9 15/3
解决方法
使用末尾注释中可重复显示的输入,使用 rollapplyr
指定偏移量 -1、-2、-3 并使用参数 partial=TRUE
使其使用少于指定的偏移量,如果只有更少的可用。由于没有先前的元素,因此无法计算第一个元素,因此指定使用 fill
参数填充第一个元素。
library(zoo)
DF2 <- transform(DF,roll =
rollapplyr(Original,list(-(1:3)),mean,partial = TRUE,fill = Original[1]))
with(DF2,identical(Desired,roll)) # check that result matches Desired
## [1] TRUE
注意
Lines <- "
Days Original Desired
1 2 2
2 4 2
3 1 3
4 3 7/3
5 5 8/3
6 6 9/3
7 4 14/3
8 9 15/3"
DF <- read.table(text = Lines,header = TRUE)
DF <- transform(DF,Desired = sapply(Desired,function(x) eval(parse(text = x))))