我有看起来像这样的数据...
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
这是连续几个小时的总和,我不希望每天总计。
答案 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创建