Суммирование последовательных строк на основе DateTime - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть данные, которые выглядят следующим образом ...

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

, и я хочу суммировать "Итого" по событиям или последовательным часам.Например, первая строка не является последовательной со второй строкой, что означает, что они разделены более чем на один час и не являются непрерывными (посмотрите на час или DateTime).Первый ряд должен составлять 0,01.Второе, третье, четвертое и пятое наблюдение (или ряды) являются непрерывными (не разделенными).Все четыре из этих наблюдений должны быть суммированы, и я хочу, чтобы эта сумма ... и так далее, и так далее.Я хочу что-то похожее на это ...

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

, которое суммирует эти последовательные часы, я не хочу ежедневную сумму.

1 Ответ

0 голосов
/ 11 февраля 2019

Вы можете проверить, больше ли разрыв между наблюдениями, чем час, и увеличить групповой индекс, если он использует 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

Создано в 2019-02-11 пакетом представ. (v0.2.1)

...