資料:
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 工具的解決方案是首選,但不是必需的。
uj5u.com熱心網友回復:
也許您可以嘗試以下方法。分配一個唯一的第二個 id id2,對于重復的、連續id的id是相同的。然后,在按 new 分組后id2,summarise取first start和last stop日期/時間。
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每個組合id和station組合的唯一組合。
此外,您可以使用unique替代firstinsummarise來保留您需要的列值(只是一個選項)。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351295.html
