首页 > 解决方案 > 具有不同移动窗口大小的向后移动平均值,以保持输出序列大小与 R 中的原始时间序列相同

问题描述

我有一个变量的长时间序列。我想执行一个窗口大小为 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

标签: rdplyrzoo

解决方案


使用末尾注释中可重复显示的输入,使用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))))

推荐阅读