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

时间:2016-10-17 00:00:06

标签: r data.table dplyr lubridate

考虑一下

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

滚动平均值
  • 过去5天(不包括当前观察)
  • 考虑与当前观察结果完全相同的 t 的观察结果。

换句话说:

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

我想在dplyrdata.table中执行此操作。我承认没有想法如何做到这一点。

有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:4)

您可以使用时间变量的rollmean()变量和group来计算hour数据,通常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