2014-12-15 13 views
15

Jak zrobić poniżej (proste korzystając sqldf) używając data.table i uzyskać dokładnie taki sam wynik:Jak wykonać łączenie w zakresie dat za pomocą 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

Czy to rozwiązuje twój problem? http://stackoverflow.com/questions/5123197/matching-time-a-time-in-interval-between-a-start-and-end-time –

+0

@DavidRobinson Dzięki. Właściwie to widziałem to pytanie i odpowiedź, ale niestety mój wolumen danych jest ogromny i wolałbym, aby szybkie rozwiązanie data.table ... – Samo

+0

Wiem, że to trochę nierealne, ale jestem jedynym, który dostał Dec-31-1969 Daktyle? Czy nie powinno to być jan-1-1970? –

Odpowiedz

17

Można korzystać z funkcji foverlaps() który implementuje dołącza nad odstępach sprawnie. W twoim przypadku potrzebujemy tylko kolumny próbnej dla measurments.

Uwaga 1: Należy zainstalować wersję rozwojową data.table - v1.9.5 jako błąd z foverlaps() została tam stała. Możesz znaleźć instrukcje instalacji here.

Uwaga 2: Zadzwonię whatWasMeasured = dt1 i measurments = dt2 tutaj dla wygody.

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] 

Zobacz ?foverlaps aby uzyskać więcej informacji i this post dla porównania wydajności.

+0

Czy jest jakiś sposób, abyśmy mogli uciec się z pewnym% pomiędzy słowem%? Trudno było uzyskać dt2 [czas w% pomiędzy% dt1 [, list (start, end)]] do pracy tak jak miałem nadzieję. –

+0

@SerbanTanasa, spójrz na [post] (http://stackoverflow.com/a/25655497/559784), które podłączyłem w mojej odpowiedzi. Porównuje także wydajność rozwiązania wykorzystującego "między". – Arun

+0

Dzięki za odpowiedź. Wspaniały. To działa. Bardzo szybki. Jedyny niewielki problem polega na tym, że nie lubi brakujących wartości dla początku, końca lub czasu. być może obsługa na.rm byłaby miła. Również podczas wykonywania tego ćwiczenia na prawdziwych danych otrzymuję w rezultacie dwie dodatkowe niechciane kolumny o nazwach "start" i "end", których nie mam ani w danych wejściowych, ani w nazwach kluczy ani nic takiego ... – Samo

Powiązane problemy