我有看起来像这样的数据...
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
答案 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
(很明显,您的随机值/实际值会有所不同)