首页 > 解决方案 > 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

标签: rdata.table

解决方案


定义ymyearmon 类并检查前一个和第二个前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

推荐阅读