r - rcppRoll n = 月数而不是 obs
问题描述
我遇到了 rcppRoll 包的问题。我想用它来总结过去 3 个月的价值,但是,有时没有 1 个月或更长时间的数据。“n = 3”考虑最后三个观察结果,而不是最后 3 个月。我找不到可靠的解决方案,所以我在这里试试运气。提前感谢您的任何建议。
PS 我更喜欢使用 data.table 和 rcpp_roll,因为我的数据集很大而且我很熟悉这些。
代码:
library("data.table")
library("RcppRoll")
test = data.table(id = rep(1, 8),date = c("2015-01","2015-02","2015-03","2015-04","2015-08","2015-09","2015-10","2015-11"), value = 1:8)
test = test[, var:= roll_sumr(value, n = 3, na.rm = TRUE), by = id]
id date value var
1: 1 2015-01 1 NA
2: 1 2015-02 2 NA
3: 1 2015-03 3 6
4: 1 2015-04 4 9
5: 1 2015-08 5 12
6: 1 2015-09 6 15
7: 1 2015-10 7 18
8: 1 2015-11 8 21
预期产出
prefered_outcome = data.table(id = rep(1, 8),date = c("2015-01","2015-02","2015-03","2015-04","2015-08","2015-09","2015-10","2015-11"), value = 1:8,var = c(NA, NA, 6, 9, NA, NA, 18, 21))
id date value var
1: 1 2015-01 1 NA
2: 1 2015-02 2 NA
3: 1 2015-03 3 6
4: 1 2015-04 4 9
5: 1 2015-08 5 NA
6: 1 2015-09 6 NA
7: 1 2015-10 7 18
8: 1 2015-11 8 21
解决方案
定义ym
yearmon 类并检查前一个和第二个前ym
一个是否是一两个月前,如果是,则使用roll_sumr
,否则使用 NA。
library(zoo)
ym <- test[, as.yearmon(date)]
test[, roll := ifelse(ym - 1/12 == shift(ym) & ym - 2/12 == shift(ym, 2),
roll_sumr(value, 3, na.rm = TRUE), NA), by = id ]
给予:
> test
id date value roll
1: 1 2015-01 1 NA
2: 1 2015-02 2 NA
3: 1 2015-03 3 6
4: 1 2015-04 4 9
5: 1 2015-08 5 NA
6: 1 2015-09 6 NA
7: 1 2015-10 7 18
8: 1 2015-11 8 21
推荐阅读
- c# - 从二进制文件读取,BinaryReader 得到“无法读取超出流的末尾。” C#
- actionscript-3 - 从符号动作停止场景
- python - 如何将 github 链接指定为 buildozer 的要求
- javascript - 如何在 javascript 文件中使用 require
- android - 使用开放的街道地图为 MapView 设置 onclicklistener
- c# - 使用 Push SDK 将用户添加到 ZKTeco 门禁
- performance - 一致的哈希和粘性会话有什么区别?
- javascript - jQuery ajax 我需要将数据库表单中的布尔值从 true 更改为 false
- interface - 什么是 Franca IDL 生态系统
- c - 循环直到用户输入'x'