R-使用带日期的中央凹的意外结果



我有两个有数百万行的数据表,其中有成对的IDs,部分日期重叠。请看下面一个非常简短的例子:

library(data.table)
dt1 <- data.table(ID=720,
startdate=as.IDate("2000-01-01"),
enddate=as.IDate("2017-10-09"))
dt2 <- data.table(ID=720,
startdate=as.IDate("2000-06-08"),
enddate=as.IDate("2020-04-12"))

我想找到两个数据集之间的重叠时间段。我正在尝试使用foverlaps:

setkey(dt1, ID, startdate, enddate)
setkey(dt2, ID, startdate, enddate)
foverlaps(dt1, dt2, by.x=c("ID", "startdate", "enddate"),
by.y=c("ID", "startdate", "enddate"), type='within', nomatch = 0L)
Empty data.table (0 rows and 5 cols): ID,startdate,enddate,i.startdate,i.enddate

上面的代码返回一个空数据表,因为dt1中的日期范围不完全dt2中的日期区域内

然而,我期望有一个数据表,其中包含两个数据集的常见日期范围,即:

ID  startdate    enddate
1: 720  2000-06-08 2017-10-09

使用foverlaps是否可以实现这一点?如果没有,有没有其他选择可以同样快速地处理数百万行?

我认为您首先需要将type='within'更改为type = 'any'

由于within表示dt1中的日期范围位于dt2

在那之后,你可能需要自己找到重叠的日期范围(这是非常精确的(。正如foverlaps只是做join

library(data.table)
dt1 <- data.table(ID=720,
startdate=as.IDate("2000-01-01"),
enddate=as.IDate("2017-10-09"))
dt2 <- data.table(ID=720,
startdate=as.IDate("2000-06-08"),
enddate=as.IDate("2020-04-12"))

setkey(dt1, ID, startdate, enddate)
setkey(dt2, ID, startdate, enddate)
result <- foverlaps(dt1, dt2, by.x=c("ID", "startdate", "enddate"),
by.y=c("ID", "startdate", "enddate"), type='any', nomatch = 0L)
result
#>     ID  startdate    enddate i.startdate  i.enddate
#> 1: 720 2000-06-08 2020-04-12  2000-01-01 2017-10-09
result[,`:=`(overlapping_start=fifelse(i.startdate>=startdate,i.startdate,startdate),
overlapping_end = fifelse(i.enddate<=enddate,i.enddate,enddate))]
result[,.(ID,overlapping_start,overlapping_end)]
#>     ID overlapping_start overlapping_end
#> 1: 720        2000-06-08      2017-10-09

创建于2020-04-19由reprex包(v0.3.0(

相关内容

  • 没有找到相关文章

最新更新