r - 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
解决方案
这是一个使用基数 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。
推荐阅读
- r - 如何让 Shiny-server 使用 Azure Active Directory
- loops - React Native:使用数组循环遍历对象数组来创建组件
- swagger - Swagger Bearer Authorization 在 ui 中不可用
- docker - 如何从不同的机器(计算机)访问 docker 容器?
- regex - bash 中 grep 对前面有几个相同字符的行的意外行为
- css - 仅 CSS 饼图 - 如何在切片之间添加间距/填充?
- r - 使用闪亮的选择,避免对搜索结果进行排序
- mysql - MariaDB:自定义数据目录:始终需要保留 /var/lib/mysql 目录
- java - java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl ,当抛出 BadRequestException
- java - 使用 Android Studio 中 EditTexts 中的值更新 mySql 表的所有列