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

标签 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-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中。非常感谢您的帮助~~

最佳答案

使用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))

关于r - 计算 r 中两个独立数据库的每个重叠日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61788872/

相关文章:

r - 如何根据来自多个列的多个条件创建一个新列?

r - 将变量名转换为变量

在 R 中 reshape data.frame

sql - 具有两个参数的 PostgreSQL 中的间隔(天)

data-warehouse - 数据仓库 : Working with accumulated data

sql - 从时间戳列中选择一个日期范围

mysql - 将日期时间条目与具有多个时间范围的表相匹配

r - 将 xts 对象的秒设置为 0

r - 加载多个软件包并禁止显示消息