【问题标题】:Summing Consecutive Hourly Observation to find Maximums对连续每小时观察求和以找到最大值
【发布时间】:2019-07-06 12:55:24
【问题描述】:

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

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

【问题讨论】:

    标签: r dplyr lubridate summarize


    【解决方案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)
      ) 
    

    请注意,这假设您在该时间段内每个小时都有一次观察。如果没有,您可能需要使用tidyr 中的complete 来添加0(或其他适当的默认值)以作为缺失的观察值。

    然后,使用zoo 中的rollsum 计算最后一个k 观测值的滚动总和。然后,summarise 获取每个感兴趣窗口的最大值。

    请注意,我在这里使用了group_by之前计算rollsum,这样总和就不会跨越月份边界。也就是说,它不是从 1 月的最后一个小时和 2 月的第一个小时计算总和。这可确保您的最大值仅适用于给定月份内完全的观察值。如果您想要不同的东西,请将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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多