r time-series data.table

¿Cómo realizar uniones sobre rangos de fechas usando data.table?



time-series (1)

Cómo hacer lo siguiente (sencillo usando sqldf) usando data.table y obtener exactamente el mismo resultado:

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")


Puede usar la función foverlaps() que implementa las uniones a intervalos de manera eficiente. En su caso, solo necesitamos una columna ficticia para las measurments .

Nota 1: debe instalar la versión de desarrollo de data.table - v1.9.5 ya que allí se ha solucionado un error con foverlaps() . Puede encontrar las instrucciones de instalación here .

Nota 2: Llamaré whatWasMeasured = dt1 y dt1 = dt2 aquí por conveniencia.

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]

Ver ?foverlaps para más información y esta publicación para una comparación de rendimiento.