Назначить уникальный идентификатор для каждой группы на основе разницы во времени между строками в R

#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