Суммирование последовательного почасового наблюдения, чтобы найти максимумы - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть данные, которые выглядят следующим образом ...

Year   Month   Day   Hour  Total  Date       DateTime
1950   1       2     21    0.01   1/2/1950   1/2/1950 21:00
1950   1       2     23    0.01   1/2/1950   1/2/1950 23:00
1950   1       3     0     0.06   1/3/1950   1/3/1950 0:00
1950   1       3     1     0.01   1/3/1950   1/3/1950 1:00
1950   1       3     2     0.02   1/3/1950   1/3/1950 2:00
1950   1       4     11    0.24   1/4/1950   1/4/1950 11:00
1950   1       4     12    0.07   1/4/1950   1/4/1950 12:00
1950   1       4     15    0.10   1/4/1950   1/4/1950 15:00
1950   1       4     16    0.04   1/4/1950   1/4/1950 16:00
1950   1       4     17    0.01   1/4/1950   1/4/1950 17:00

, и теперь я хочу найти наибольшее общее количество за два часа подряд (меня также интересует самое большое количество последовательных трех, четырех, пяти часов)Всего).В приведенных выше данных наибольшее общее двухчасовое значение составило бы 0,31 (суммируя наблюдения шесть и семь).Самым большим 3-часовым итогом будут последние три наблюдения.Важно то, что наблюдения должны быть последовательными!Если наблюдения разбросаны на 5 часов, но сумма в целом не важна.Меня интересует наибольшая сумма (из общего столбца) в последовательных наблюдениях (2-часовые суммы, 3-часовые суммы, 4-часовые суммы и т. Д.).То, что я снимаю, - это наибольшие 2-часовые или трехчасовые итоговые результаты по годам и месяцам, с выходом, который выглядит следующим образом ...

Year    Month    Two Hour Greatest
1950    1         0.31
1951    4         0.77
1952    3         0.91
1953    8         0.63

1 Ответ

0 голосов
/ 12 февраля 2019

Во-первых, вот некоторые примеры данных (сделанные с помощью инструментов из 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

(Очевидно, что ваши рандомизированные / фактические значения будут другими)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...