#r #dataframe
#r #dataframe
Вопрос:
У меня есть dataframe [df], подобный этому:
marker_id timestamp
A 2020-10-01 07:32:14
A 2020-10-01 07:34:09
A 2020-10-01 10:13:00
A 2020-10-05 06:55:04
A 2020-10-05 06:59:14
A 2020-10-09 17:44:02
B 2020-10-01 13:58:47
B 2020-10-02 04:11:38
B 2020-10-02 04:15:07
Я хотел бы знать, существует ли способ присвоения групп отдельным последовательностям временных меток для каждого marker_id. Последовательность должна содержать строки, в которых разница между 2 строками составляет менее 1 часа.
Желаемый результат будет выглядеть следующим образом:
marker_id timestamp group_id
A 2020-10-01 07:32:14 1
A 2020-10-01 07:34:09 1
A 2020-10-01 10:13:00 2
A 2020-10-05 06:55:04 3
A 2020-10-05 06:59:14 3
A 2020-10-09 17:44:02 4
B 2020-10-01 13:58:47 5
B 2020-10-02 04:11:38 6
B 2020-10-02 04:15:07 6
Есть ли какой-либо способ сделать это? Спасибо за любые предложения.
Ответ №1:
Вот некоторые фиктивные данные.
library(tidyverse)
df <- tribble(
~marker_id, ~timestamp,
'A', '2020-10-01 07:32:14',
'A', '2020-10-01 07:34:09',
'A', '2020-10-01 10:13:00',
'A', '2020-10-05 06:55:04',
'A', '2020-10-05 06:59:14',
'A', '2020-10-09 17:44:02',
'B', '2020-10-01 13:58:47',
'B', '2020-10-02 04:11:38',
'B', '2020-10-02 04:15:07'
) %>%
mutate(timestamp = lubridate::as_datetime(timestamp))
Используется lag
для получения разницы между строками и преобразования ее в часы. group_id
может быть вычислен путем проверки, если это >= 1
так, и получения cumsum
.
df %>%
mutate(
group_id = cumsum(
abs(as.numeric(timestamp - lag(timestamp, default = min(timestamp)), units = "hours")) >= 1
) 1
)
#> # A tibble: 9 x 3
#> marker_id timestamp group_id
#> <chr> <dttm> <dbl>
#> 1 A 2020-10-01 07:32:14 1
#> 2 A 2020-10-01 07:34:09 1
#> 3 A 2020-10-01 10:13:00 2
#> 4 A 2020-10-05 06:55:04 3
#> 5 A 2020-10-05 06:59:14 3
#> 6 A 2020-10-09 17:44:02 4
#> 7 B 2020-10-01 13:58:47 5
#> 8 B 2020-10-02 04:11:38 6
#> 9 B 2020-10-02 04:15:07 6