从r中的两个独立数据库计算每个重叠日期范围

从r中的两个独立数据库计算每个重叠日期范围,r,date-range,R,Date Range,我有两个独立的数据库,一个包含后续数据(开始日期和结束日期)。详情如下: > data1 <- data.frame("ID" = c(1,1,1,1,2,2,2), "FUstart" = c("2019-01-01", "2019-04-01", "2019-07-01", "2019-10-01", "2019-04-01", "2019-07-01", "2019-10-01"), "FUend" = c("2019-03-31", "2019-06-30", "2019-0

我有两个独立的数据库,一个包含后续数据(开始日期和结束日期)。详情如下:

> data1 <- data.frame("ID" = c(1,1,1,1,2,2,2), "FUstart" = c("2019-01-01", "2019-04-01", "2019-07-01", "2019-10-01", "2019-04-01", "2019-07-01", "2019-10-01"), "FUend" = c("2019-03-31", "2019-06-30", "2019-09-30", "2019-12-31", "2019-06-30", "2019-09-30", "2019-12-31"))
> data1
  ID    FUstart      FUend
1  1 2019-01-01 2019-03-31
2  1 2019-04-01 2019-06-30
3  1 2019-07-01 2019-09-30
4  1 2019-10-01 2019-12-31
5  2 2019-04-01 2019-06-30
6  2 2019-07-01 2019-09-30
7  2 2019-10-01 2019-12-31
> data2 <- data.frame("ID" = c(1,1,1,2), "Drugstart" = c("2019-01-11", "2019-03-26", "2019-06-26", "2019-03-20"), "Drugend" = c("2019-01-20", "2019-04-05", "2019-10-05", "2019-10-10"))
> data2
  ID  Drugstart    Drugend
1  1 2019-01-11 2019-01-20
2  1 2019-03-26 2019-04-05
3  1 2019-06-26 2019-10-05
4  2 2019-03-20 2019-10-10

请注意,data1是基本数据库。并将数据2的重叠天数添加到数据1中。非常感谢您帮助~~

使用
数据的选项。table::foverlaps

foverlaps(data1, data2)[, 
    sum(1L + pmin(Drugend, FUend) - pmax(Drugstart, FUstart)), 
    .(ID, FUstart, FUend)]
输出,我也从OP的预期输出中得到了稍微不同的数字:

   ID    FUstart      FUend V1
1:  1 2019-01-01 2019-03-31 16
2:  1 2019-04-01 2019-06-30 10
3:  1 2019-07-01 2019-09-30 92
4:  1 2019-10-01 2019-12-31  5
5:  2 2019-04-01 2019-06-30 91
6:  2 2019-07-01 2019-09-30 92
7:  2 2019-10-01 2019-12-31 10
数据:

库(data.table)
setDT(数据1)

cols如何计算第16天和第10天的重叠??data1的第一行是否与data2的第一行匹配?data1的第一行与data2的第一行和第二行相关。在数据2中,2019-01-11至2019-01-20(10天)和2019-03-26至2019-03-31(6天)添加到数据1中。第一天和最后一天也算作重叠的日子。非常感谢!但我还有一个问题,第一天和最后一天也算作重叠的日子。因此,这可能是不同输出的原因。例如,数据1的第一行与数据2的第一行和第二行相关。在数据2中,从2019-01-11到2019-01-20(10天)以及从2019-03-26到2019-03-31(6天)添加到数据1中(总共16天)。但你的结果是14天。这个问题可以解决吗?谢谢~将pmin(Drugend,FUend)更改为pmin(Drugend+1,FUend+1)似乎可以解决这个问题。
   ID    FUstart      FUend V1
1:  1 2019-01-01 2019-03-31 16
2:  1 2019-04-01 2019-06-30 10
3:  1 2019-07-01 2019-09-30 92
4:  1 2019-10-01 2019-12-31  5
5:  2 2019-04-01 2019-06-30 91
6:  2 2019-07-01 2019-09-30 92
7:  2 2019-10-01 2019-12-31 10
library(data.table)
setDT(data1)
cols <- paste0("FU", c("start","end"))
data1[, (cols) := lapply(.SD, as.IDate, format="%Y-%m-%d"), .SDcols=cols]
setkeyv(data1, c("ID", cols))

#too lazy to generalize and hence copy paste
setDT(data2)
cols <- paste0("Drug", c("start","end"))
data2[, (cols) := lapply(.SD, as.IDate, format="%Y-%m-%d"), .SDcols=cols]
setkeyv(data2, c("ID", cols))