#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), они могут сгруппироваться по этому.