【问题标题】:R - unexpected result using foverlaps with datesR - 使用日期重叠的意外结果
【发布时间】:2020-08-01 03:19:15
【问题描述】:

我有两个包含数百万行的数据表,其中有一对 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 来实现这一点?如果没有,是否有任何替代方法可以同样快速地处理数百万行?

【问题讨论】:

    标签: r date data.table overlap


    【解决方案1】:

    我认为您首先需要将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
    

    reprex package (v0.3.0) 于 2020 年 4 月 19 日创建

    【讨论】:

    • 或者省略 type 参数,因为 "any" 是默认值。
    猜你喜欢
    • 2018-04-25
    • 2018-09-22
    • 2022-10-14
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多