总结连续的每小时观察以找到最大值

时间:2019-02-12 19:39:06

标签: r dplyr lubridate summarize

我有看起来像这样的数据...

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(总计观察值6和7)。总共3个小时最大的时间是最后三个观测值。重要的是观察必须连续!如果观察结果分散了5个小时,但总和很高,那并不重要。我对连续观察(2小时总和,3小时总和,4小时总和,等等)中的最高总和(来自总列)感兴趣。我要拍摄的是按年份和月份显示的连续最大2个小时或3个小时的连续记录,输出如下所示:

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

1 个答案:

答案 0 :(得分:1)

首先,这是一些示例数据(使用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

(很明显,您的随机值/实际值会有所不同)