R - найти все возможные парные совпадения дат - PullRequest
1 голос
/ 07 марта 2020

Я работаю с набором данных, который показывает временную доступность данных наблюдений для нескольких метеорологических станций:

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

Мне нужно найти перекрывающиеся даты для всех возможных пар идентификаторов. Основываясь на ответах на мой предыдущий вопрос ( 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

Но обратите внимание, что в исходном наборе данных вышеуказанные идентификаторы имеют перекрывающиеся даты:

> 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?

1 Ответ

4 голосов
/ 08 марта 2020

Ваш код в порядке, но порядок идентификаторов в вашем подмножестве обратный. Попробуйте olap[ID1==872 & ID2==997].

...