Здесь difftime()
- лучший выбор, чем diff()
, поскольку можно указать единицы измерения.
Если я правильно понимаю, последовательность POSIXct
отметок времени считается последовательной, если разница во времени равна 24 часов или более, но менее 48 часов.
Приведенный ниже код воспроизводит ожидаемый результат для образца набора данных:
library(dplyr)
library(magrittr)
df %>%
group_by(group) %>%
mutate(want = difftime(date, lag(date, default = date[1L]), units = "days") %>%
floor() %>%
equals(1) %>%
not() %>%
cumsum() %>%
data.table::rowid(),
want2 = max(want))
# A tibble: 7 x 4
# Groups: group [2]
group date want want2
<dbl> <dttm> <int> <int>
1 1 2000-01-01 00:00:00 1 3
2 1 2000-01-03 00:00:00 1 3
3 1 2000-01-04 07:07:40 2 3
4 1 2000-01-05 09:09:00 3 3
5 2 2000-01-09 00:00:00 1 2
6 2 2000-01-10 14:00:00 2 2
7 2 2000-01-11 13:00:00 1 2
Пояснение
df %>%
group_by(group) %>%
mutate(delta = difftime(date, lag(date, default = date[1L]), units = "days"))
возвращает
# A tibble: 7 x 5
# Groups: group [2]
group date want want2 delta
<dbl> <dttm> <dbl> <dbl> <drtn>
1 1 2000-01-01 00:00:00 1 3 0.0000000 days
2 1 2000-01-03 00:00:00 1 3 2.0000000 days
3 1 2000-01-04 07:07:40 2 3 1.2969907 days
4 1 2000-01-05 09:09:00 3 3 1.0842593 days
5 2 2000-01-09 00:00:00 1 2 0.0000000 days
6 2 2000-01-10 14:00:00 2 2 1.5833333 days
7 2 2000-01-11 13:00:00 1 2 0.9583333 days
Округляя до следующего нижнего целого (floor()
), можно использовать лог c для случая Date
.
Данные
library(magrittr)
df <- data.frame(
group = c(1, 1, 1, 1, 2, 2, 2),
date = c(
"2000-01-01 00:00:00",
"2000-01-03 00:00:00",
"2000-01-04 07:07:40",
"2000-01-05 09:09:00",
"2000-01-09 00:00:00",
"2000-01-10 14:00:00",
"2000-01-11 13:00:00"
) %>% lubridate::as_datetime(),
want = c(1, 1, 2, 3, 1, 2, 1),
want2 = c(3, 3, 3, 3, 2, 2, 2)
)