如何使用 R 中连续 id 计数的开始和结束时间戳合并行,但基于每个组?

How to merge rows using start and finish timestamps of a consecutive id count in R, but per-group basis?

数据:

      id station start               stop               
   <int>   <dbl> <dttm>              <dttm>             
 1     1       1 1899-12-31 00:05:04 1899-12-31 00:13:36
 2     2       1 1899-12-31 00:14:04 1899-12-31 00:21:32
 3     3       1 1899-12-31 00:21:32 1899-12-31 00:26:56
 4     4       1 1899-12-31 00:26:57 1899-12-31 00:27:10
 5     1       1 1899-12-31 00:38:32 1899-12-31 00:38:38
 6     3       1 1899-12-31 00:43:23 1899-12-31 00:43:47
 7     5       1 1899-12-31 00:53:00 1899-12-31 00:53:15
 8     6       1 1899-12-31 00:53:29 1899-12-31 00:55:49
 9     6       1 1899-12-31 00:56:15 1899-12-31 00:56:42
10     7       1 1899-12-31 01:14:30 1899-12-31 01:28:09
11     3       1 1899-12-31 01:28:09 1899-12-31 01:31:17
12     3       2 1899-12-31 01:34:22 1899-12-31 01:35:11
13     7       3 1899-12-31 01:36:44 1899-12-31 01:39:54
14     8       3 1899-12-31 01:41:49 1899-12-31 01:44:45
15     9       2 1899-12-31 01:44:47 1899-12-31 01:52:07

需求:

我需要合并重复 id 的次数,以便它们只计为一个。例如,id #6 有两个连续的动作,每个动作都有开始和停止时间(第 8 行和第 9 行)。所需的输出将是,而不是这个:

11     3       1 1899-12-31 01:28:09 1899-12-31 01:31:17
12     3       2 1899-12-31 01:34:22 1899-12-31 01:35:11

会显示类似这样的内容

11     3       1 1899-12-31 01:28:09 1899-12-31 01:35:11

因此,这两个事件作为一个事件具有第一个开始时间戳和第二个停止时间戳。

注意事项

这个解决方案只有在它们属于同一个 station 时才应该合并时间,因此例如在第 11 行的样本数据 id #3 中不会与第 12 行合并,因为它们属于不同的站.

首选使用 tidyverse 工具的解决方案,但不是必需的。

也许您可以尝试以下方法。分配一个唯一的第二个 id id2,对于重复、连续的 id's 是相同的。然后,在按新的 id2summarise 分组后,取 first startlast stop dates/times.

library(tidyverse)
library(data.table)

df %>%
  mutate(id2 = rleid(id)) %>%
  group_by(id2) %>%
  summarise(id = first(id), start = first(start), stop = last(stop)) %>%
  ungroup() %>%
  select(id, start, stop)

输出

      id start               stop               
   <int> <dttm>              <dttm>             
 1     1 1899-12-31 00:05:04 1899-12-31 00:13:36
 2     2 1899-12-31 00:14:04 1899-12-31 00:21:32
 3     3 1899-12-31 00:21:32 1899-12-31 00:26:56
 4     4 1899-12-31 00:26:57 1899-12-31 00:27:10
 5     1 1899-12-31 00:38:32 1899-12-31 00:38:38
 6     3 1899-12-31 00:43:23 1899-12-31 00:43:47
 7     5 1899-12-31 00:53:00 1899-12-31 00:53:15
 8     6 1899-12-31 00:53:29 1899-12-31 00:56:42
 9     7 1899-12-31 01:14:30 1899-12-31 01:28:09
10     3 1899-12-31 01:28:09 1899-12-31 01:35:11
11     7 1899-12-31 01:36:44 1899-12-31 01:39:54
12     8 1899-12-31 01:41:49 1899-12-31 01:44:45
13     9 1899-12-31 01:44:47 1899-12-31 01:52:07

对于给定 id 的不同电台的警告,您可以将 station 添加到 rleid,这样您将获得每个组合的唯一 id2 idstation 合并。

此外,您可以使用 unique 替代 summarise 中的 first 以保留您需要的列值(只是一个选项)。

df %>%
  mutate(id2 = rleid(id, station)) %>%
  group_by(id2) %>%
  summarise(id = unique(id), station = unique(station), start = first(start), stop = last(stop)) %>%
  ungroup() %>%
  select(id, station, start, stop)

输出

      id station start               stop               
   <int>   <dbl> <dttm>              <dttm>             
 1     1       1 1899-12-31 00:05:04 1899-12-31 00:13:36
 2     2       1 1899-12-31 00:14:04 1899-12-31 00:21:32
 3     3       1 1899-12-31 00:21:32 1899-12-31 00:26:56
 4     4       1 1899-12-31 00:26:57 1899-12-31 00:27:10
 5     1       1 1899-12-31 00:38:32 1899-12-31 00:38:38
 6     3       1 1899-12-31 00:43:23 1899-12-31 00:43:47
 7     5       1 1899-12-31 00:53:00 1899-12-31 00:53:15
 8     6       1 1899-12-31 00:53:29 1899-12-31 00:56:42
 9     7       1 1899-12-31 01:14:30 1899-12-31 01:28:09
10     3       1 1899-12-31 01:28:09 1899-12-31 01:31:17
11     3       2 1899-12-31 01:34:22 1899-12-31 01:35:11
12     7       3 1899-12-31 01:36:44 1899-12-31 01:39:54
13     8       3 1899-12-31 01:41:49 1899-12-31 01:44:45
14     9       2 1899-12-31 01:44:47 1899-12-31 01:52:07