从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))