Во-первых, вот некоторые примеры данных (сделанные с помощью инструментов из lubridate
)
df <-
tibble(
date_time = seq(ymd_hm("1950-01-01 00:00")
, ymd_hm("1951-12-30 23:00")
, "1 hour")
) %>%
mutate(
Total = round(runif(n()), 2)
, Year = year(date_time)
, Month = month(date_time)
)
Обратите внимание, что это предполагает, что у вас есть наблюдение за каждый час в период времени.Если нет, вы можете использовать complete
из tidyr
, чтобы добавить 0
(или другое подходящее значение по умолчанию) для отсутствующих наблюдений.
Затем используйте rollsum
из zoo
длярассчитать скользящую сумму последних k
наблюдений.Затем summarise
, чтобы получить максимальное значение для каждого интересующего окна.
Обратите внимание, что здесь я использовал group_by
до вычисления rollsum
, чтобы суммирование не пересекалосьГраницы месяца.То есть, это не вычисление итогов за последний час января и первый час февраля.Это гарантирует, что ваш максимум только для наблюдений, которые полностью в течение данного месяца.Если вы хотите что-то другое, переместите шаг group_by
на после rollsum
и убедитесь, что вы удовлетворены тем, где align
помещает результат в rollsum
(в месяце последнего наблюдения,в приведенном ниже примере).
Код:
df %>%
group_by(Year, Month) %>%
mutate(
two_hour_tot = rollsum(Total, k = 2, fill = NA, align = "right")
, three_hour_tot = rollsum(Total, k = 3, fill = NA, align = "right")
, four_hour_tot = rollsum(Total, k = 4, fill = NA, align = "right")
) %>%
summarise(
two_hour_max = max(two_hour_tot, na.rm = TRUE)
, three_hour_max = max(three_hour_tot, na.rm = TRUE)
, four_hour_max = max(four_hour_tot, na.rm = TRUE)
)
Возвращает:
# A tibble: 24 x 5
# Groups: Year [?]
Year Month two_hour_max three_hour_max four_hour_max
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1950 1 1.98 2.76 3.43
2 1950 2 1.96 2.68 3.57
3 1950 3 1.96 2.91 3.65
4 1950 4 1.98 2.91 3.7
5 1950 5 1.95 2.76 3.65
6 1950 6 1.97 2.82 3.53
7 1950 7 1.97 2.8 3.71
8 1950 8 1.94 2.85 3.53
9 1950 9 2.00 2.77 3.43
10 1950 10 1.93 2.82 3.7
# … with 14 more rows
(Очевидно, что ваши рандомизированные / фактические значения будут другими)