Как выполнить объединение диапазонов дат с использованием data.table?

Как сделать следующее (прямо с использованием sqldf) с использованием data.table и получить тот же результат:

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

Ответ 1

Вы можете использовать функцию foverlaps(), которая эффективно выполняет объединение по интервалам. В вашем случае нам нужен только фиктивный столбец для measurments.

Примечание 1: Вы должны установить версию разработки data.table - v1.9.5, поскольку там была исправлена ​​ошибка с foverlaps(). Инструкции по установке здесь.

Примечание 2: Я буду называть whatWasMeasured= dt1 и measurments= dt2 здесь для удобства.

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]

Подробнее см. ?foverlaps и этот пост для сравнения производительности.