R:如何获得变量在过去几天但仅在给定时间的滚动平均值?

R : how to get the rolling mean of a variable over the last few days but only at a given hour?

考虑一下

time <- seq(ymd_hms("2014-02-24 23:00:00"), ymd_hms("2014-06-25 08:32:00"), by="hour")
group <- rep(LETTERS[1:20], each = length(time))
value <- sample(-10^3:10^3,length(time), replace=TRUE)
df2 <- data.frame(time,group,value)
str(df2)

> head(df2)
                 time group value
1 2014-02-24 23:00:00     A   246
2 2014-02-25 00:00:00     A  -261
3 2014-02-25 01:00:00     A   628
4 2014-02-25 02:00:00     A   429
5 2014-02-25 03:00:00     A   -49
6 2014-02-25 04:00:00     A  -749

我想创建一个变量,其中包含每个组的 滚动平均值 value

换句话说:

在时间 2014-02-24 23:00:00df2['rolling_mean_same_hour'] 包含数据中过去 5 天在 23:00:00 观察到的 value 值的平均值(不包括 2014-02-24当然)。

我想在 dplyrdata.table 中这样做。我承认我不知道该怎么做。

有什么想法吗?

非常感谢!

您可以使用按 group 变量和 hour 时间变量分组的数据计算 rollmean(),通常 rollmean() 将包括当前观察值,但您可以使用 shift() 函数从 rollmean:

中排除当前观察
library(data.table); library(zoo)
setDT(df2)
df2[, .(rolling_mean_same_hour = shift(
                                       rollmean(value, 5, na.pad = TRUE, align = 'right'), 
                                       n = 1, 
                                       type = 'lag'), 
        time), .(hour(time), group)]

#       hour group rolling_mean_same_hour                time
#    1:   23     A                     NA 2014-02-24 23:00:00
#    2:   23     A                     NA 2014-02-25 23:00:00
#    3:   23     A                     NA 2014-02-26 23:00:00
#    4:   23     A                     NA 2014-02-27 23:00:00
#    5:   23     A                     NA 2014-02-28 23:00:00
#   ---                                                      
#57796:   22     T                 -267.0 2014-06-20 22:00:00
#57797:   22     T                 -389.6 2014-06-21 22:00:00
#57798:   22     T                 -311.6 2014-06-22 22:00:00
#57799:   22     T                 -260.0 2014-06-23 22:00:00
#57800:   22     T                  -26.8 2014-06-24 22:00:00