【发布时间】:2019-03-14 12:33:49
【问题描述】:
我有以下data.frame:
grp nr yr
1: A 1.0 2009
2: A 2.0 2009
3: A 1.5 2009
4: A 1.0 2010
5: B 3.0 2009
6: B 2.0 2010
7: B NA 2011
8: C 3.0 2014
9: C 3.0 2019
10: C 3.0 2020
11: C 4.0 2021
期望的输出:
grp nr yr nr_roll_period_3
1 A 1.0 2009 NA
2 A 2.0 2009 NA
3 A 1.5 2009 NA
4 A 1.0 2010 NA
5 B 3.0 2009 NA
6 B 2.0 2010 NA
7 B NA 2011 NA
8 C 3.0 2014 NA
9 C 3.0 2019 NA
10 C 3.0 2020 NA
11 C 4.0 2021 3.333333
逻辑:
- 我想计算长度为 k(假设为 3)期间的滚动平均值,其中 3 包括当前月/年/日(按组)
- 但是,如果没有连续 3 年/月/日,则不应计算任何内容
- 同样,只要在此期间计算的列中有NA,则输出应为NA。
目前我有这个功能:
calculate_rolling_window <-
function(dt, date_col, calc_col, id, k) {
require(data.table)
return(setDT(dt)[
, paste(calc_col, "roll_period", k, sep = "_") :=
sapply(get(date_col), function(x) mean(get(calc_col)[between(get(date_col), x - k + 1, x)])),
by = mget(id)])
}
它适用于日期列中没有重复项的常规情况。但是,重复它会失败:
grp nr yr nr_roll_period_3
1: A 1.0 2009 1.500000
2: A 2.0 2009 1.500000
3: A 1.5 2009 1.500000
4: A 1.0 2010 1.375000
5: B 3.0 2009 NA
6: B 2.0 2010 NA
7: B NA 2011 NA
8: C 3.0 2014 NA
9: C 3.0 2019 NA
10: C 3.0 2020 NA
11: C 4.0 2021 3.333333
关于如何处理这个问题的任何想法?不需要专门的data.table 方法。
【问题讨论】:
-
谢谢,但是已经尝试了这些方法,但不能满足当前的要求。
标签: r date time-series rolling-computation