¿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 confoverlaps()
. Puede encontrar las instrucciones de instalación here .Nota 2: Llamaré
whatWasMeasured
=dt1
ydt1
=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.