2017-12-11 5 views
0

Ich arbeite an dem Versuch, eine Zeitmarke und eine andere Variable zusammenzuführen, insbesondere, wie viele Ambulette-Pickups in eine Kette fallen, die Idee ist das Dies sind mehrere Pickups mit dem gleichen Ambulette in einer Kette, die als die gleiche Gesamtfahrt betrachtet wird, während diejenigen, die allein Trips sind, alleine stehen.Abrufen von Nicht-Übereinstimmungen für Y (RIGHT JOIN) für Foverlaps in R mit Zeitstempeln

Ich habe sqldf für diese verwendet, aber foverslaps scheint viel schneller und skalierbarer, so möchte ich dieses Paket oder eines wie es nutzen. Ich bin in der Lage, die beiden zusammenzufassen, um zu finden, wie viele Projektstartzeiten in die Kettenzeiten fallen, aber ich bekomme keine Rendite auf die Non-Matches in y.

Unten ist der Code zu reproduzieren, in diesem Fall mit nur einer Ambulette, die durch die ID dotiert wurde. Ich verwende diesen Link als Referenz: Data Table merge based on date ranges

#example--- 
trips = data.table(
    "ambulette_id" = "1" 
    ,"pickup" = as.POSIXct(c("2017-08-01 04:30:54", 
         "2017-08-01 04:50:54", "2017-08-01 05:25:54", "2017-08-01 05:35:54", 
         "2017-08-01 07:45:54", "2017-08-01 08:15:54", "2017-08-01 09:15:54", 
         "2017-08-01 09:15:54", "2017-08-01 10:00:54", "2017-08-01 11:40:54", 
         "2017-08-01 12:00:54", "2017-08-01 12:40:54"), tz = "GMT") 
    ,"dropoff" = as.POSIXct(c("2017-08-01 05:00:59", 
         "2017-08-01 05:00:59", "2017-08-01 05:55:59", "2017-08-01 05:55:59", 
         "2017-08-01 08:35:59", "2017-08-01 08:35:59", "2017-08-01 09:30:59", 
         "2017-08-01 09:45:59", "2017-08-01 10:30:59", "2017-08-01 11:50:59", 
         "2017-08-01 12:15:59", "2017-08-01 13:05:59"), tz = "GMT") 
)[,pickup2:=pickup] 


chains = data.table(
    "ambulette_id" = "1" 
    ,"ambulette_chain_start" = as.POSIXct(c("2017-08-01 04:30:54", 
          "2017-08-01 05:25:54", "2017-08-01 07:45:54", "2017-08-01 09:15:54" 
), tz = "GMT") 
    ,"ambulette_chain_end" = as.POSIXct(c("2017-08-01 05:00:59", "2017-08-01 05:55:59", 
          "2017-08-01 08:35:59", "2017-08-01 09:45:59"),tz = "GMT") 
) 



#The final result is to merge trips on chains to get the pickups in trips that start in between the ranges in chains. Any pickups that don't match, should still show up as lone pickups, but instead foverlaps dumps them. Is there anyway to keep them? 


setkey(trips,ambulette_id,pickup, pickup2) 
final_join = foverlaps(chains 
         ,trips 
         ,by.x = c("ambulette_id", "ambulette_chain_start", "ambulette_chain_end"))[ 
         ,pickup2:=NULL] 

#test shows some trips not showing up in the final join 
trips[!(pickup %in% final_join$pickup)] 

unterhalb der SQL-Version, die mir das Ergebnis Ich möchte bekommt:

#sqldf version 
library(sqldf) 
z = setDT(sqldf("SELECT 
       trips.ambulette_id, 
       trips.pickup, 
       trips.dropoff, 
       chains.ambulette_chain_start, 
       chains.ambulette_chain_end 
       FROM trips LEFT JOIN chains 
       ON trips.ambulette_id = chains.ambulette_id AND 
       pickup BETWEEN ambulette_chain_start AND ambulette_chain_end"))[ 
       ,chained:=ifelse(is.na(ambulette_chain_start), "no", "yes")] 

z 

UPDATE:

Die erste Antwort scheint zu beantworten fast die ganze Frage, aber ich möchte die Ambulette-Kette zu Beginn und Ende Spalten aus dem Merge halten, so dass das Endprodukt wie folgt aussieht. Wie würde ich das tun?

ambulette_id    pickup    dropoff ambulette_chain_start ambulette_chain_end chained 
1:   1 2017-08-01 00:30:54 2017-08-01 01:00:59 2017-08-01 00:30:54 2017-08-01 01:00:59  yes 
2:   1 2017-08-01 00:50:54 2017-08-01 01:00:59 2017-08-01 00:30:54 2017-08-01 01:00:59  yes 
3:   1 2017-08-01 01:25:54 2017-08-01 01:55:59 2017-08-01 01:25:54 2017-08-01 01:55:59  yes 
4:   1 2017-08-01 01:35:54 2017-08-01 01:55:59 2017-08-01 01:25:54 2017-08-01 01:55:59  yes 
5:   1 2017-08-01 03:45:54 2017-08-01 04:35:59 2017-08-01 03:45:54 2017-08-01 04:35:59  yes 
6:   1 2017-08-01 04:15:54 2017-08-01 04:35:59 2017-08-01 03:45:54 2017-08-01 04:35:59  yes 
7:   1 2017-08-01 05:15:54 2017-08-01 05:30:59 2017-08-01 05:15:54 2017-08-01 05:45:59  yes 
8:   1 2017-08-01 05:15:54 2017-08-01 05:45:59 2017-08-01 05:15:54 2017-08-01 05:45:59  yes 
9:   1 2017-08-01 06:00:54 2017-08-01 06:30:59     <NA>    <NA>  no 
10:   1 2017-08-01 07:40:54 2017-08-01 07:50:59     <NA>    <NA>  no 
11:   1 2017-08-01 08:00:54 2017-08-01 08:15:59     <NA>    <NA>  no 
12:   1 2017-08-01 08:40:54 2017-08-01 09:05:59     <NA>    <NA>  no 

WEITERE UPDATE: wie vorgeschlagen Umsetzung: 1. entfällt die keine Zuordnung 2. Die Kette Zuweisungen

hinzugefügt
trips[ 
    chains, on = .(ambulette_id, pickup > ambulette_chain_start, 
       pickup < ambulette_chain_end) 
    ,':='(chained = 'yes' 
     , ambulette_chain_start = ambulette_chain_start 
     ,ambulette_chain_end = ambulette_chain_end)] 

ambulette_id    pickup    dropoff    pickup2 chained ambulette_chain_start 
1:   1 2017-08-01 04:30:54 2017-08-01 05:00:59 2017-08-01 04:30:54  NA     <NA> 
2:   1 2017-08-01 04:50:54 2017-08-01 05:00:59 2017-08-01 04:50:54  yes 2017-08-01 04:30:54 
3:   1 2017-08-01 05:25:54 2017-08-01 05:55:59 2017-08-01 05:25:54  NA     <NA> 
4:   1 2017-08-01 05:35:54 2017-08-01 05:55:59 2017-08-01 05:35:54  yes 2017-08-01 05:25:54 
5:   1 2017-08-01 07:45:54 2017-08-01 08:35:59 2017-08-01 07:45:54  NA     <NA> 
6:   1 2017-08-01 08:15:54 2017-08-01 08:35:59 2017-08-01 08:15:54  yes 2017-08-01 07:45:54 
7:   1 2017-08-01 09:15:54 2017-08-01 09:30:59 2017-08-01 09:15:54  NA     <NA> 
8:   1 2017-08-01 09:15:54 2017-08-01 09:45:59 2017-08-01 09:15:54  NA     <NA> 
9:   1 2017-08-01 10:00:54 2017-08-01 10:30:59 2017-08-01 10:00:54  NA     <NA> 
10:   1 2017-08-01 11:40:54 2017-08-01 11:50:59 2017-08-01 11:40:54  NA     <NA> 
11:   1 2017-08-01 12:00:54 2017-08-01 12:15:59 2017-08-01 12:00:54  NA     <NA> 
12:   1 2017-08-01 12:40:54 2017-08-01 13:05:59 2017-08-01 12:40:54  NA     <NA> 
    ambulette_chain_end 
1:    <NA> 
2: 2017-08-01 05:00:59 
3:    <NA> 
4: 2017-08-01 05:55:59 
5:    <NA> 
6: 2017-08-01 08:35:59 
7:    <NA> 
8:    <NA> 
9:    <NA> 
10:    <NA> 
11:    <NA> 
12:    <NA> 

Ich Implementierung falsch Ich gehe davon aus, da das Ergebnis anders ist als ich bin immer mit sQL oder die vorherige Lösung

Antwort

2

Hier gehen Sie:

trips[, chained := 'no'][ 
     chains, on = .(ambulette_id, pickup >= ambulette_chain_start, 
            pickup <= ambulette_chain_end) 
     , `:=`(chained = 'yes', 
      ambulette_chain_start = i.ambulette_chain_start, 
      ambulette_chain_end = i.ambulette_chain_end)][] 
+0

Auch wie würde ich den Code anpassen, um die Variablen "ambulette_chain_start" und "ambulette_chain_end" beizubehalten? – LoF10

+0

von behalten Sie meinen zu Trips hinzufügen? füge es wie oben beschrieben hinzu. – eddi

+0

Ich habe der Frage eine Bearbeitung hinzugefügt, damit Sie sehen können, was ich meine. Ich habe versucht, nur hinzuzufügen, wie Sie erwähnt haben, aber ich kann es nicht zur Arbeit bringen. – LoF10

Verwandte Themen