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

问题描述 投票:1回答:1

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

> 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

两个数据库通过“ ID”链接。问题是每个ID的行可能不相同。我想计算重叠的天并将其添加到data1中。我希望得到以下结果:

> data1
  ID    FUstart      FUend Overlapping.Days
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

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

r date-range
1个回答
2
投票

使用data.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

数据:

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))
© www.soinside.com 2019 - 2024. All rights reserved.