2017-08-18 1 views
0

ist Alles funktioniert, aber es ist sehr langsam mit zwei For-Schleifen iterieren.Join basiert auf einer Spalte und nächste Zeit, die nicht über

Grundsätzlich 2 Datenrahmen, einer mit und IDs und Ereigniszeit. Die andere mit verschiedenen IDs und Lesungen (Wert und Zeitstempel) alle 10 Sekunden oder so.

Ich versuche, eine Tabelle zu einer anderen zu verbinden, indem Sie sowohl die ID, als auch die Zeit in einem bestimmten Intervall vor der Ereigniszeit, sagen wir 20 Sekunden.

Alternativ sind die Daten in einem Oracle-SQL-Server, die, wenn ich die Tabelle Joins in SQL, die funktioniert auch tun könnte.

readingdf <- data.frame(sensorID = c('100001','100001','100001','100001','100002','100002','100002','100002'), 
        readTime = as.POSIXct(c("2017-07-24 04:08:09 EDT","2017-07-24 04:08:19 EDT", 
        "2017-07-24 04:08:29 EDT","2017-07-24 04:08:39 EDT","2017-07-24 04:08:09 EDT","2017-07-24 04:08:19 EDT", 
        "2017-07-24 04:08:29 EDT","2017-07-24 04:08:39 EDT"),tz="EST"), 
        Value = c('17.5','15.6','12.9','12.1','22.2', '24.5','19.7','20.1')) 


df <- data.frame(sensorID = c('100001','100002','100001','100002','100001','100002','100001','100001'), 
        eventTime = as.POSIXct(c("2017-07-24 04:08:23 EDT","2017-07-24 04:08:25 EDT","2017-07-24 07:04:40 EDT", 
        "2017-07-24 02:19:30 EDT","2017-07-24 04:37:08 EDT","2017-07-24 04:19:59 EDT","2017-07-24 03:26:49 EDT", 
        "2017-07-24 03:58:17 EDT"),tz="EST")) 
+0

was meinst du Intervall 20 Sekunden? Bitte erläutern. Wenn möglich, können Sie hier die erwartete Ausgabe einfügen? Vielen Dank – Onyambu

+0

Wenn Ihre Tabellen groß sind, sollten Sie den Join im Oracle-Server tun: verwenden Sie etwas wie 'select * von t1 innerer Join t2 on (t1.sensorID = t2.sensorID und readTime <= eventTime und f (eventTime, readTime) <= 20) ',' f' ist eine Funktion, die den Unterschied zwischen zwei Datumsangaben in Sekunden angibt (Sie müssen sie definieren). – Scarabee

Antwort

0

Wir können eine neue Spalte, readTime_expand, erstellen Sie die nächsten 20 Sekunden readTime zeigt. Führen Sie danach eine Verknüpfung basierend auf sensorID mit eventTime = readTime_expand durch. df2 ist die endgültige Ausgabe.

library(tidyverse) 

readingdf2 <- readingdf %>% 
    mutate(readTime_end = readTime + 20) %>% 
    mutate(readTime_expand = map2(readTime, readTime_end, function(x, y){ 
    return(seq(x, y, by = 1)) 
    })) %>% 
    unnest() 

df2 <- df %>% 
    left_join(readingdf2, by = c("sensorID", "eventTime" = "readTime_expand")) 

df2 
    sensorID   eventTime   readTime Value  readTime_end 
1 100001 2017-07-24 04:08:23 2017-07-24 04:08:09 17.5 2017-07-24 04:08:29 
2 100001 2017-07-24 04:08:23 2017-07-24 04:08:19 15.6 2017-07-24 04:08:39 
3 100002 2017-07-24 04:08:25 2017-07-24 04:08:09 22.2 2017-07-24 04:08:29 
4 100002 2017-07-24 04:08:25 2017-07-24 04:08:19 24.5 2017-07-24 04:08:39 
5 100001 2017-07-24 07:04:40    <NA> <NA>    <NA> 
6 100002 2017-07-24 02:19:30    <NA> <NA>    <NA> 
7 100001 2017-07-24 04:37:08    <NA> <NA>    <NA> 
8 100002 2017-07-24 04:19:59    <NA> <NA>    <NA> 
9 100001 2017-07-24 03:26:49    <NA> <NA>    <NA> 
10 100001 2017-07-24 03:58:17    <NA> <NA>    <NA> 
Verwandte Themen