Я работаю с набором данных, который показывает временную доступность данных наблюдений для нескольких метеорологических станций:
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
?