【发布时间】:2022-01-17 17:33:14
【问题描述】:
我有一个数据集,其中包含发生干预的时间段。我们有两种干预措施。我有每次干预的开始和结束日期。我现在想提取两种类型之间没有重叠的时间(以天为单位)以及重叠的程度。
这是一个示例数据集:
data <- data.table( id = seq(1,21),
type = as.character(c(1,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,1,1,1,1,1)),
start_dt = as.Date(c("2015-01-09", "2015-04-14", "2015-06-19", "2015-10-30", "2016-03-01", "2016-05-24",
"2016-08-03", "2017-08-18", "2017-08-18", "2018-02-01", "2018-05-07", "2018-08-09",
"2019-01-31", "2019-03-22", "2019-05-16", "2019-11-04", "2019-11-04", "2020-02-06",
"2020-05-28", "2020-08-25", "2020-12-14")),
end_dt = as.Date(c("2017-07-24", "2015-05-04", "2015-08-27", "2015-11-19", "2016-03-21", "2016-06-09",
"2017-07-18", "2019-02-21", "2018-01-23", "2018-04-25", "2018-07-29", "2019-01-15",
"2019-04-24", "2019-09-13", "2019-10-13", "2020-12-23", "2020-01-26", "2020-04-29",
"2020-08-19", "2020-11-16", "2021-03-07")))
> data
id type start_dt end_dt
1: 1 1 2015-01-09 2017-07-24
2: 2 2 2015-04-14 2015-05-04
3: 3 2 2015-06-19 2015-08-27
4: 4 2 2015-10-30 2015-11-19
5: 5 2 2016-03-01 2016-03-21
6: 6 2 2016-05-24 2016-06-09
7: 7 2 2016-08-03 2017-07-18
8: 8 2 2017-08-18 2019-02-21
9: 9 1 2017-08-18 2018-01-23
10: 10 1 2018-02-01 2018-04-25
11: 11 1 2018-05-07 2018-07-29
12: 12 1 2018-08-09 2019-01-15
13: 13 1 2019-01-31 2019-04-24
14: 14 2 2019-03-22 2019-09-13
15: 15 1 2019-05-16 2019-10-13
16: 16 2 2019-11-04 2020-12-23
17: 17 1 2019-11-04 2020-01-26
18: 18 1 2020-02-06 2020-04-29
19: 19 1 2020-05-28 2020-08-19
20: 20 1 2020-08-25 2020-11-16
21: 21 1 2020-12-14 2021-03-07
这是数据图,以便更好地了解我想知道的内容:
library(ggplot2)
ggplot(data = data,
aes(x = start_dt, xend = end_dt, y = id, yend = id, color = type)) +
geom_segment(size = 2) +
xlab("") +
ylab("") +
theme_bw()
我将描述示例的第一部分:从2015-01-09 到2017-07-24,我们有一个类型 1 的干预。然而,从2015-04-14 开始,干预类型 2 也在发生。这意味着我们只有从2015-01-09 到2015-04-13 的“纯”类型1,即95 天。
然后我们有一个从2015-04-14 到2015-05-04 的重叠期,也就是 21 天。然后我们再次有一个只有类型 1 从2015-05-05 到2015-06-18 的周期,即 45 天。总的来说,我们现在有 (95 + 45 =) 140 天的“纯”类型 1 和 21 天的重叠。然后我们在整个时间段内继续这样。
我想知道“纯”类型 1、“纯”类型 2 和重叠的总时间(以天为单位)。
或者,如果可能的话,我想组织数据,以便提取所有单独的时间段,这意味着数据看起来像这样(类型 3 = 重叠):
> data_adjusted
id type start_dt end_dt
1: 1 1 2015-01-09 2015-04-14
2: 2 3 2015-04-15 2015-05-04
3: 3 1 2015-05-05 2015-06-18
4: 4 3 2015-06-19 2015-08-27
........
然后可以从data_adjuted 轻松计算每种干预类型花费的时间(以天为单位)。
我使用dplyr 或只是标记重叠的时间段有类似的答案,但我还没有找到针对我的具体案例的答案。
有没有一种使用data.table 计算的有效方法?
【问题讨论】:
标签: r date time data.table overlap