首页 > 解决方案 > R:填充时间序列值,但仅在过去 12 个月内

问题描述

我们如何在 R 中填充/转发时间序列,但前提是最后一个值在过去 12 个月/观察范围内,否则不适用?

样本数据:变量是原始的,期望的是期望的结果。我们从 2016 年 6 月开始观察 NA,但我们将转发 pad。我只想这样做 12 个月,所以一旦我们到达 2017 年 7 月,最后一个非 NA 时间太长了,应该是 NA。这就是为什么像 fill() 这样的东西不会做

例子

最小工作示例:考虑以下使用 max gap 和 na.locf

x = c(NA,1,2,3,NA,NA,5,6,7,NA,NA,NA)
zoo::na.locf(x,  maxgap = 2, na.rm = FALSE)

当 NA 的数量> 最大间隙时,我不想填充任何东西,而是想要以下输出:NA,1,2,3,3,3,5,6,7,7,7,NA。因此,如果我指定 gap =2 我希望最多填充两个值,并且任何更多的 NA 应该保持 NA

标签: rtime-series

解决方案


这是一个使用基数 R k的单线。指定间隙大小。 x在问题的最小工作示例中定义。

cumsum(!is.na(x))产生一个分组向量,其中每个非 NA 后跟任何 NA 被视为一个组。然后对于每个这样的组,用组的第一个元素替换前 k+1 个元素(或组中元素的数量,如果更少),其余元素为 NA。

k <- 2
ave(x, cumsum(!is.na(x)), FUN = function(x) replace(x, 1:min(length(x), k+1), x[1]))
## [1] NA  1  2  3  3  3  5  6  7  7  7 NA

请注意,此 SO 答案中也使用了这个想法Change maxgap for number of times a value was carry forward against data.table。


推荐阅读