2017-02-28 6 views
0

Ich kann keine Lösung für dieses Problem finden. Ich habe zwei Datenrahmen. DF1 und DF2. Ich möchte die Spalten von DF2 zu DF1 zusammenführen, wenn der Zeitstempel in DF1 innerhalb des in DF2 angegebenen Zeitintervalls liegt. Hier ist ein Beispiel für die beiden Datenrahmen:Mischen Sie zwei Datenrahmen, wenn der Zeitstempel von x innerhalb des Zeitintervalls von y liegt

DF1 <- structure(list(Airspeed = c(582L, 478L, 524L), Outbound.Track = c(119L, 78L,134L), Rem.Ground.Dist = c(369L, 119L, 196L), Timestamp=structure(c(1451636817.52577, 1451638203.76569, 1451637753.43511),class = c("POSIXct", "POSIXt"), tzone = "")), .Names =c("Airspeed", "Outbound.Track","Rem.Ground.Dist", "Timestamp"), row.names =c(1L, 12L, 7L), class = c("data.table", "data.frame")) 

DF2 <- structure(list(Temperature = c(-18.5, -60, -35), Wind_Direction = c("324", "335", "313"), Wind_Speed = c("032", "041", "056"), onebef =structure(c(1451629620, 1451634660, 1451637000), class = c("POSIXct", "POSIXt"), tzone = ""), oneaft = structure(c(1451636820, 1451641860, 1451644200), class =c("POSIXct", "POSIXt"))), .Names = c("Temperature", "Wind_Direction", "Wind_Speed","onebef", "oneaft"), row.names = c(1358L, 1654L, 2068L), class = "data.frame") 

head(DF1) 
head(DF2) 

Ich möchte DF1 mit DF2 verschmelzen. Wenn also eine Übereinstimmung vorliegt (der Zeitstempel von DF1 liegt innerhalb des Zeitintervalls eines beliebigen DF2), sollten die Werte von DF2 (Wind_Speed, Wind_Direction, Temperature) zu DF1 hinzugefügt werden.

Zwei Probleme Ich bin vor:

  1. Wie das Spiel tun/fusionieren? Mein Datenrahmen ist ziemlich groß (7000 Zeilen in DF1 und DF2)

  2. Wie sicherzustellen, dass Zeilen von DF1 dupliziert werden, wenn es mehrere Übereinstimmungen gibt?

Ich freue mich auf Ihre Hilfe! Dank

Antwort

2

Sie sqldf verwenden:

library(sqldf) 
df<-sqldf('select d1.*,d2.* 
      from DF1 d1 
      left join DF2 d2 
      on d1.Timestamp >= d2.onebef 
       AND d1.Timestamp <= d2.oneaft 
      ') 
df 
+0

oder '... auf d1.Timestamp zwischen d2.onebef und d2.oneaft' –

0

Dies wird mit Ihrem Beispiel gut funktionieren, aber Sie könnten mit den realen Datensatz kämpfen, da es eine sehr große Datenmenge schaffen (kombiniert jede Zeile von DF1 mit DF2), bevor es die relevanten Zeilen hält.

Probieren Sie es aus und sehen Sie, wie es funktioniert.

library(dplyr) 

DF1 <- structure(list(Airspeed = c(582L, 478L, 524L), Outbound.Track = c(119L, 78L,134L), Rem.Ground.Dist = c(369L, 119L, 196L), Timestamp=structure(c(1451636817.52577, 1451638203.76569, 1451637753.43511),class = c("POSIXct", "POSIXt"), tzone = "")), .Names =c("Airspeed", "Outbound.Track","Rem.Ground.Dist", "Timestamp"), row.names =c(1L, 12L, 7L), class = c("data.table", "data.frame")) 

DF2 <- structure(list(Temperature = c(-18.5, -60, -35), Wind_Direction = c("324", "335", "313"), Wind_Speed = c("032", "041", "056"), onebef =structure(c(1451629620, 1451634660, 1451637000), class = c("POSIXct", "POSIXt"), tzone = ""), oneaft = structure(c(1451636820, 1451641860, 1451644200), class =c("POSIXct", "POSIXt"))), .Names = c("Temperature", "Wind_Direction", "Wind_Speed","onebef", "oneaft"), row.names = c(1358L, 1654L, 2068L), class = "data.frame") 


merge(DF1, DF2) %>%         # combine every row of DF1 with DF2 
    filter(onebef <= Timestamp & Timestamp <= oneaft) # keep rows where Timestampe is between the interval 


# Airspeed Outbound.Track Rem.Ground.Dist   Timestamp Temperature Wind_Direction Wind_Speed    onebef    oneaft 
# 1  582   119    369 2016-01-01 08:26:57  -18.5   324  032 2016-01-01 06:27:00 2016-01-01 08:27:00 
# 2  582   119    369 2016-01-01 08:26:57  -60.0   335  041 2016-01-01 07:51:00 2016-01-01 09:51:00 
# 3  478    78    119 2016-01-01 08:50:03  -60.0   335  041 2016-01-01 07:51:00 2016-01-01 09:51:00 
# 4  524   134    196 2016-01-01 08:42:33  -60.0   335  041 2016-01-01 07:51:00 2016-01-01 09:51:00 
# 5  478    78    119 2016-01-01 08:50:03  -35.0   313  056 2016-01-01 08:30:00 2016-01-01 10:30:00 
# 6  524   134    196 2016-01-01 08:42:33  -35.0   313  056 2016-01-01 08:30:00 2016-01-01 10:30:00 
+0

Unfortuantely erhalte ich die Fehler von differening Anzahl der Zeilen. Irgendeine Möglichkeit, diesen Fehler zu umgehen? – Anna2803

+0

In welchem ​​Schritt erhalten Sie diesen Fehler? Liegt es an den realen Datensätzen oder am Beispiel? – AntoniosK

+0

Im realen Datensatz. Beispiel funktioniert perfekt. – Anna2803

1

können Sie verwenden merge() mit der all = TRUE Option, um alle Zeilen von DF1 mit allen Zeilen aus DF2 zu kombinieren. Dann können Sie Ihren Zustand überprüfen:

x <- merge(DF1, DF2, all = TRUE) 

x[x$Timestamp >= x$onebef & x$Timestamp <= x$oneaft,] 

    Airspeed Outbound.Track Rem.Ground.Dist   Timestamp Temperature Wind_Direction Wind_Speed    onebef 
1  582   119    369 2016-01-01 09:26:57  -18.5   324  032 2016-01-01 07:27:00 
4  582   119    369 2016-01-01 09:26:57  -60.0   335  041 2016-01-01 08:51:00 
5  478    78    119 2016-01-01 09:50:03  -60.0   335  041 2016-01-01 08:51:00 
6  524   134    196 2016-01-01 09:42:33  -60.0   335  041 2016-01-01 08:51:00 
8  478    78    119 2016-01-01 09:50:03  -35.0   313  056 2016-01-01 09:30:00 
9  524   134    196 2016-01-01 09:42:33  -35.0   313  056 2016-01-01 09:30:00 
      oneaft 
1 2016-01-01 09:27:00 
4 2016-01-01 10:51:00 
5 2016-01-01 10:51:00 
6 2016-01-01 10:51:00 
8 2016-01-01 11:30:00 
9 2016-01-01 11:30:00 
Verwandte Themen