2016-05-13 10 views
0

Ich versuche einen Datenrahmen zu vervollständigen, der Lücken hat. Die Daten sind stündlich strukturiert und es gibt einige Sprünge zwischen den Stunden. Dies ist ein Beispiel des Datenrahmen:Füllen Sie Lücken durch Zusammenführen mit Datenrahmen, die abgeschlossen ist?

sms <- read.csv("hoursms2.csv", sep = ";", header = FALSE) 
sms$date <- strptime(sms$date,"%d/%m/%Y %H:%M") 

date      count 

2015-12-17 22:00:00  5 
2015-12-18 09:00:00  7 
2015-12-18 10:00:00  3 
2015-12-18 12:00:00  6 

Was ich versucht habe, ist ein anderen Datenrahmen zu schaffen, der bis zum Ende des ersten Datenrahmen von Anfang reicht, aber mit allen Stunden und mit einer eindeutigen Kennung zu halten Spur davon:

hh <- seq(min(sms$date), max(sms$date), by="hour") 
hh <- as.data.frame(hh) 
hh <- cbind(hh,seq(1:3292)) #length of the hh data frame 

Welche der folgenden gibt:

date      id 
2015-12-04 12:00:00  1 
2015-12-04 13:00:00  2 
2015-12-04 14:00:00  3 
2015-12-04 15:00:00  4 
2015-12-04 16:00:00  5 

ich habe diese drei Dinge Bisher habe ich versucht, auf Stackoverflow gefunden, here, aber sie tun in diesem Fall nicht funktionieren:

res <- merge(sms,hh,by = "date", all = TRUE) 
res2 <- res[duplicated(res$date), ] 
res3 <- res[!duplicated(res), ] 

Die erste commmand, res, was alle Zellen zu duplizieren tut, ist, sie es nach dem Datum nicht fusionieren, so gibt es folgendes:

2015-12-23 19:00:00  5 
2015-12-23 19:00:00  NA 

Die anderen vermasseln alles. Ich denke, es hat etwas mit dem Datumsformat zu tun, das nicht korrekt zugeordnet ist, aber nicht sicher. Irgendwelche Vorschläge, wie ich meinen Datenrahmen nach Daten vervollständigen könnte?

+0

Eine der Möglichkeiten besteht darin, 'left_join()' aus 'dplyr'-Paket zu verwenden. Du machst 'left_join (hh, sms)' und das sollte dir geben, was du willst, denke ich. – Gopala

+0

@Gopala Probieren Sie es aus und geben Sie den folgenden Fehler: Beitritt durch: "Datum" Fehler: kann nicht bei Spalten 'Datum' x 'Datum': nicht am 'Datum' x 'Datum' wegen inkompatiblen Typen (POSIXct, POSIXt/POSIXlt, POSIXt) – adrian1121

Antwort

1

Verwenden Sie die Bibliothek dplyr, und stellen Sie sicher, dass Sie die richtigen Typen in beiden Datenrahmen haben. Hier

ist die Art, wie ich die beiden Datenrahmen ein:

str(sms) 
'data.frame': 4 obs. of 2 variables: 
$ date : POSIXct, format: "2015-12-17 22:00:00" "2015-12-18 09:00:00" "2015-12-18 10:00:00" ... 
$ count: int 5 7 3 6 
str(hh) 
'data.frame': 15 obs. of 2 variables: 
$ date: POSIXct, format: "2015-12-17 22:00:00" "2015-12-17 23:00:00" "2015-12-18 00:00:00" ... 
$ id : int 1 2 3 4 5 6 7 8 9 10 ... 

Hier ist der LEFT JOIN Code:

library(dplyr) 
left_join(hh, sms) 
Joining by: "date" 
        date id count 
1 2015-12-17 22:00:00 1  5 
2 2015-12-17 23:00:00 2 NA 
3 2015-12-18 00:00:00 3 NA 
4 2015-12-18 01:00:00 4 NA 
5 2015-12-18 02:00:00 5 NA 
6 2015-12-18 03:00:00 6 NA 
7 2015-12-18 04:00:00 7 NA 
8 2015-12-18 05:00:00 8 NA 
9 2015-12-18 06:00:00 9 NA 
10 2015-12-18 07:00:00 10 NA 
11 2015-12-18 08:00:00 11 NA 
12 2015-12-18 09:00:00 12  7 
13 2015-12-18 10:00:00 13  3 
14 2015-12-18 11:00:00 14 NA 
15 2015-12-18 12:00:00 15  6 

Hinweis: Ich musste Spaltennamen in hh-date konvertieren als der fragliche Code tut das nicht. Alternativ können Sie den Parameter by im left_join Aufruf angeben.

+0

vielen Dank! Das Problem war tatsächlich im Datumsformat! – adrian1121