基于DateTime汇总连续行

时间:2019-02-11 19:38:16

标签: r dplyr lubridate

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

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.01。第二,第三,第四和第五个观察值(或行)是连续的(不分开)。所有这四个观察值都应加起来,我希望得到总数……依此类推。 我想要看起来像这样的东西...

Year    Month    Sum
1950    1         0.01
1950    1         0.10
1950    1         0.31
1950    1         0.15

这是连续几个小时的总和,我不希望每天总计。

1 个答案:

答案 0 :(得分:0)

您可以检查观察值之间的间隔是否大于一个小时,如果使用cumsum,则可以增加组索引。这使您可以创建连续观察的组,然后创建summarise以获取所需的总数。请注意,我在T列中添加了DateTime,以便read_table2将其理解为一列。最好的做法是提供一个dput,以便我们可以轻松地以您拥有的格式存储数据。

library(tidyverse)
library(lubridate)

tbl <- read_table2(
"Year   Month   Day   Hour  Total  Date       DateTime
1950   1       2     21    0.01   1/2/1950   1/2/1950T21:00
1950   1       2     23    0.01   1/2/1950   1/2/1950T23:00
1950   1       3     0     0.06   1/3/1950   1/3/1950T0:00
1950   1       3     1     0.01   1/3/1950   1/3/1950T1:00
1950   1       3     2     0.02   1/3/1950   1/3/1950T2:00
1950   1       4     11    0.24   1/4/1950   1/4/1950T11:00
1950   1       4     12    0.07   1/4/1950   1/4/1950T12:00
1950   1       4     15    0.10   1/4/1950   1/4/1950T15:00
1950   1       4     16    0.04   1/4/1950   1/4/1950T16:00
1950   1       4     17    0.01   1/4/1950   1/4/1950T17:00"
) %>%
  mutate(Date = mdy(Date), DateTime = mdy_hm(DateTime))

tbl %>%
  mutate(group = cumsum(c(0, int_diff(DateTime)) > 3600)) %>%
  group_by(Year, Month, group) %>%
  summarise(Sum = sum(Total))
#> # A tibble: 4 x 4
#> # Groups:   Year, Month [?]
#>    Year Month group   Sum
#>   <dbl> <dbl> <int> <dbl>
#> 1  1950     1     0  0.01
#> 2  1950     1     1  0.1 
#> 3  1950     1     2  0.31
#> 4  1950     1     3  0.15

reprex package(v0.2.1)于2019-02-11创建