2013-01-20 13 views
8

Ho un data.frame con una colonna di data. Queste date possono verificarsi molte volte, ma anche zero tempo:Come riempire le (date-) lacune di data.frame?

 date value 
1 2013-01-01  5 
2 2013-01-01  3 
3 2013-01-03  3 
4 2013-01-04  3 
5 2013-01-04  1 
6 2013-01-06  1 

Come faccio a compilare la data-lacune in questo data.frame così ottengo il seguente?

 date value 
1 2013-01-01  5 
2 2013-01-01  3 
3 2013-01-02  0 
4 2013-01-03  3 
5 2013-01-04  3 
6 2013-01-04  1 
7 2013-01-05  0 
8 2013-01-06  1 

Qualsiasi aiuto è benvenuto.

TIA, Jerry

risposta

14

È possibile merge tua data.frame con un altro data.frame containg tutte le date in sequenza. qui presumo che dat sia il tuo data.frame originale.

hh<- data.frame(date=seq(as.Date("2013-01-01"), as.Date("2013-01-6"), by="days")) 
>res <- merge(dat,hh,by.x='date',by.y='date',all.x=T,all.y=T) 
     date value 
1 2013-01-01  5 
2 2013-01-01  3 
3 2013-01-02 NA 
4 2013-01-03  3 
5 2013-01-04  3 
6 2013-01-04  1 
7 2013-01-05 NA 
8 2013-01-06  1 

Ora abbiamo NA per ogni riga in dat che non ha una riga corrispondente in hh. Personalmente, penso che sia meglio avere NA dire che le tesi mancano valori, ma li si può impostare a 0:

res$value[is.na(res$value)] <- 0 

Modifica

per la generalità è possibile generare hh come mostrato in @Arun soluzione:

 hh <- seq(min(dat$date), max(dat$date), by="days") 
+1

@Arun, grazie! Ho usato la tua idea per generare le seq date in generale. – agstudy

+0

Grazie mille. Stavo provando anche con un secondo data.frame. Ma ho sempre usato un df con la colonna del valore AND per i valori predefiniti. Quindi dopo la fusione ho sempre avuto troppe colonne. :-( – JerryWho

+0

@JerryWho vedo, la chiave per usare l'unione sono le colonne delle chiavi .. visto che date il by.x e le altre colonne by.y non importa .. – agstudy