首页 > 解决方案 > R - 找到所有可能的成对日期重叠

问题描述

我正在使用一个数据集,该数据集显示了多个气象站观测数据的时间可用性:

library(data.table)
dat <- fread("https://www.dropbox.com/s/fih7e2o8hrnewx7/dat.csv?dl=1") # ~43 KB

> dat
        ID  startdate    enddate
   1:  193 2000-01-01 2003-12-02
   2:    1 2000-01-01 2006-12-03
   3:    2 2000-01-01 2006-12-03
   4:    4 2000-01-01 2006-12-03
   5:    5 2000-01-01 2006-12-03
  ---                           
1631: 1277 2017-05-01 2019-11-09
1632: 1300 2017-05-01 2019-11-09
1633: 1321 2017-05-01 2019-11-09
1634: 1248 2017-05-06 2018-06-21
1635: 1265 2017-05-08 2019-12-18

我需要的是找到所有可能的 ID 对的重叠日期。根据对我上一个问题的反馈(R - 根据另一个数据框查找每组的重叠日期),这是我迄今为止尝试过的:

# convert character to dates
cols <- c("startdate","enddate")
dat[, (cols) := lapply(.SD, as.Date), .SDcols = cols]

# perform overlapping join
# i.e. find common dates for each station pair
setkey(dat, startdate, enddate)
olap <- unique(foverlaps(dat, dat)[ID!=i.ID, .(
  ID1=pmin(ID, i.ID),
  ID2=pmax(ID, i.ID),
  common_date_begin=pmax(startdate, i.startdate),
  common_date_end=pmin(enddate, i.enddate))])

> olap
          ID1  ID2 common_date_begin common_date_end
      1:    1  193        2000-01-01      2003-12-02
      2:    2  193        2000-01-01      2003-12-02
      3:    4  193        2000-01-01      2003-12-02
      4:    5  193        2000-01-01      2003-12-02
      5:    6  193        2000-01-01      2003-12-02
     ---                                            
1270379: 1248 1300        2017-05-06      2018-06-21
1270380: 1265 1300        2017-05-08      2019-11-09
1270381: 1248 1321        2017-05-06      2018-06-21
1270382: 1265 1321        2017-05-08      2019-11-09
1270383: 1248 1265        2017-05-08      2018-06-21

起初,这似乎是我想要的。但是,有一些对没有出现在结果数据表中,尽管它们确实有重叠的时间段。一些例子是:

> olap[ID1==997 & ID2==872]
Empty data.table (0 rows and 4 cols): ID1,ID2,common_date_begin,common_date_end

> olap[ID1==997 & ID2==785]
Empty data.table (0 rows and 4 cols): ID1,ID2,common_date_begin,common_date_end

但请注意,在原始数据集中,上述 ID 确实有重叠日期:

> dat[ID==997]
    ID  startdate    enddate
1: 997 2000-03-01 2017-01-22
> dat[ID==872]
    ID  startdate    enddate
1: 872 2000-03-01 2019-08-09
> dat[ID==785]
    ID  startdate    enddate
1: 785 2000-03-01 2019-12-31

我做错了什么?我错过了任何论点foverlaps吗?

标签: rmergedata.table

解决方案


您的代码很好,但您的子集中 ID 的顺序是向后的。试试olap[ID1==872 & ID2==997]


推荐阅读