簡體   English   中英

給定日期范圍和相應的 ID,查找日期重疊的 ID 組

[英]Given date ranges and corresponding IDs, find groups of IDs with overlapping dates

我有一個帶有 dateRanges 和相應 ID 的表。 我想根據 ID 的開始/結束范圍是否與另一個 ID 的日期范圍重疊來對 ID 進行分組。 如果一個 ID 的日期范圍部分或完全在另一個 ID 的日期范圍內,則它們應該屬於同一組。 我想添加一列指示此分組,以及由組內最小和最大日期給出的開始/結束日期。

數據:

"ID"    "start" "end"
1   2018-10-02  2019-01-15
2   2019-01-13  2019-02-01
3   2018-10-01  2018-11-01
4   2018-10-05  2018-10-06
5   2019-09-09  2019-10-08
6   2019-02-06  2019-04-07
7   2019-03-24  2019-04-17
8   2019-03-21  2019-04-14
9   2019-03-27  2019-04-16
10  2019-04-30  2019-05-08

理想的結果:

"ID"    "start" "end"   "group_ID"  "group_start"   "group_end"
1   2018-10-02  2019-01-15  1   2018-10-01  2019-02-01
2   2019-01-13  2019-02-01  1   2018-10-01  2019-02-01
3   2018-10-01  2018-11-01  1   2018-10-01  2019-02-01
4   2018-10-05  2018-10-06  1   2018-10-01  2019-02-01
5   2019-09-09  2019-10-08  2   2019-09-09  2019-10-08
6   2019-02-06  2019-04-07  3   2019-02-06  2019-05-08
7   2019-03-24  2019-04-17  3   2019-02-06  2019-05-08
8   2019-03-21  2019-04-14  3   2019-02-06  2019-05-08
9   2019-03-27  2019-04-16  3   2019-02-06  2019-05-08
10  2019-04-30  2019-05-08  3   2019-02-06  2019-05-08

我一直在想的可能是創建一個 ID 矩陣(即從 ID 1 到 ID 10 的行和列)並填充每個單元格,以確定給定 ID 交叉點的日期范圍是否重疊。 在此之后,分箱然后分組並找到給定組的最小值/最大值,但這似乎非常復雜。 必須有一個更簡單的解決方案,不涉及查看矩陣上的邊來創建集群。

.csv 的編輯格式:

ID,start,end
1,2018-10-02,2019-01-15
2,2019-01-13,2019-02-01
3,2018-10-01,2018-11-01
4,2018-10-05,2018-10-06
5,2019-09-09,2019-10-08
6,2019-02-06,2019-04-07
7,2019-03-24,2019-04-17
8,2019-03-21,2019-04-14
9,2019-03-27,2019-04-16
10,2019-04-30,2019-05-08

這是一個選項:

setorder(DT, start, end)
DT[order(start, end), g := cumsum(start > shift(cummax(as.integer(end)), fill=0L))][,
    c("gstart","gend") := .(min(start), max(end)), g]    

輸出:

    ID      start        end g     gstart       gend
 1:  1 2018-10-02 2019-01-15 1 2018-10-01 2019-02-01
 2:  2 2019-01-13 2019-02-01 1 2018-10-01 2019-02-01
 3:  3 2018-10-01 2018-11-01 1 2018-10-01 2019-02-01
 4:  4 2018-10-05 2018-10-06 1 2018-10-01 2019-02-01
 5:  5 2019-09-09 2019-10-08 4 2019-09-09 2019-10-08
 6:  6 2019-02-06 2019-04-07 2 2019-02-06 2019-04-17
 7:  7 2019-03-24 2019-04-17 2 2019-02-06 2019-04-17
 8:  8 2019-03-21 2019-04-14 2 2019-02-06 2019-04-17
 9:  9 2019-03-27 2019-04-16 2 2019-02-06 2019-04-17
10: 10 2019-04-30 2019-05-08 3 2019-04-30 2019-05-08

數據:

library(data.table)
DT <- fread("ID,start,end
1,2018-10-02,2019-01-15
2,2019-01-13,2019-02-01
3,2018-10-01,2018-11-01
4,2018-10-05,2018-10-06
5,2019-09-09,2019-10-08
6,2019-02-06,2019-04-07
7,2019-03-24,2019-04-17
8,2019-03-21,2019-04-14
9,2019-03-27,2019-04-16
10,2019-04-30,2019-05-08")
cols <- c("start", "end")
DT[, (cols) := lapply(.SD, as.IDate, format="%Y-%m-%d"), .SDcols=cols]

參考: 如何展平/合並重疊的時間段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM