R: как получить среднее значение переменной за последние несколько дней, но только в определенный час?

#r #data.table #dplyr #lubridate

#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 дней (не включая текущее наблюдение)
  • только с учетом наблюдений, которые выпадают на тот же час, что и текущее наблюдение.

Другими словами:

Во времени 2014-02-24 23:00:00 df2['rolling_mean_same_hour'] содержит среднее значение value значений, наблюдаемых в 23:00:00 течение последних 5 дней в данных (не включая 2014-02-24 , конечно).

Я хотел бы сделать это в любом dplyr или data.table . Признаюсь, у меня нет идей, как это сделать.

Есть идеи?

Большое спасибо!

Ответ №1:

Вы можете рассчитать 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
 

Комментарии:

1. Fwiw, data.table также имеет формат «время суток» ITime , поэтому, если OP поместит переменную в этот формат (две переменные: IDate, iTime), они могут сгруппироваться по этому.