2013-01-20 8 views
8

Mam data.frame z kolumną daty. Terminy te mogą występować wielokrotnie, ale również zerową czas:Jak wypełnić (date-) luki w 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 

Jak mam wypełnić Date-luk w tej data.frame więc pojawia się następujący?

 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 

Każda pomoc jest mile widziane.

TIA, Jerry

Odpowiedz

14

Można merge swoją data.frame z innym data.frame zawierajacego wszystkie daty w kolejności. tutaj zakładam, że dat to twoja oryginalna data.frame.

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 

Teraz mamy NA dla każdego wiersza w dat, który nie ma zgodnego wiersza w hh. Osobiście uważam, że lepiej jest mieć na to powiedzieć, że tezy brakuje wartości, ale można je ustawić na 0:

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

Edit

dla ogólności można wygenerować hh jak pokazano na @Arun rozwiązanie:

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

@Arun dzięki! Użyłem twojego pomysłu, aby wygenerować seq daty w ogólnym przypadku. – agstudy

+0

Wielkie dzięki. Próbowałem też z drugą strukturą danych. Ale zawsze używałam df z datą I kolumną wartości dla wartości domyślnych. Więc po scaleniu zawsze mam za dużo kolumn. :-( – JerryWho

+0

@JerryWho Widzę, kluczem do użycia korespondencji seryjnej są kolumny kolumnowe .. od kiedy podajesz by.x i by.y inne kolumny nie mają znaczenia ... – agstudy