Come eseguire join su intervalli di date utilizzando data.table?

Come fare il seguito (usando semplicemente sqldf) usando data.table e ottenere lo stesso risultato esatto:

library(data.table) whatWasMeasured <- data.table(start=as.POSIXct(seq(1, 1000, 100), origin="1970-01-01 00:00:00"), end=as.POSIXct(seq(10, 1000, 100), origin="1970-01-01 00:00:00"), x=1:10, y=letters[1:10]) measurments <- data.table(time=as.POSIXct(seq(1, 2000, 1), origin="1970-01-01 00:00:00"), temp=runif(2000, 10, 100)) ## Alternative short names for data.tables dt1 <- whatWasMeasured dt2 <- measurments ## Straightforward with sqldf library(sqldf) sqldf("select * from measurments m, whatWasMeasured wwm where m.time between wwm.start and wwm.end") 

È ansible utilizzare la funzione foverlaps() che implementa efficientemente i join su intervalli. Nel tuo caso, abbiamo solo bisogno di una colonna fittizia per le measurments .

Nota 1: è necessario installare la versione di sviluppo di data.table – v1.9.5 come errore in foverlaps() . Puoi trovare le istruzioni di installazione qui .

Nota 2: whatWasMeasured = dt1 e measurments = dt2 qui per comodità.

 require(data.table) ## 1.9.5+ dt2[, dummy := time] setkey(dt1, start, end) ans = foverlaps(dt2, dt1, by.x=c("time", "dummy"), nomatch=0L)[, dummy := NULL] 

Vedi ?foverlaps per maggiori informazioni e questo post per un confronto delle prestazioni.