2015-10-19 10 views
9

Ho un vettore "Data", che contiene le date in formato mm/gg/aaaa:Come posso raggruppare la mia data variabile in mese/anno in R?

head(Entered_Date,5) 
[1] 1/5/1998 1/5/1998 1/5/1998 1/5/1998 1/5/1998 

Sto cercando di tracciare una variabile di frequenza contro la data, ma voglio raggruppare le date che si tratta di per mese o anno. Come è ora, c'è una frequenza al giorno, ma voglio tracciare la frequenza per mese o anno. Quindi, invece di avere una frequenza di 1 per 1/5/1998, 1 per 1/7/1998 e 3 per 1/8/1998, vorrei visualizzarlo come 5 per 1/1998. Si tratta di un set di dati relativamente ampio, con date dal 1998 ad oggi, e mi piacerebbe trovare un modo automatico per raggiungere questo obiettivo.

> dput(head(Entered_Date)) 
structure(c(260L, 260L, 260L, 260L, 260L, 260L), .Label = c("1/1/1998", 
"1/1/1999", "1/1/2001", "1/1/2002", "1/10/2000", "1/10/2001", 
"1/10/2002", "1/10/2003", "1/10/2005", "1/10/2006", "1/10/2007", 
"1/10/2008", "1/10/2011", "1/10/2012", "1/10/2013", "1/11/1999", 
"1/11/2000", "1/11/2001", "1/11/2002", "1/11/2005", "1/11/2006", 
"1/11/2008", "1/11/2010", "1/11/2011", "1/11/2012", "1/11/2013", 
"1/12/1998", "1/12/1999", "1/12/2001", "1/12/2004", "1/12/2005", ... 
+2

Per essere certi di risultati riproducibili, si prega di postare l'output o f 'dput (head (Entered_Date))' –

+0

Dai un'occhiata a 'as.yearmon' dal pacchetto' zoo'. – Jaap

risposta

13

Ecco un esempio utilizzando dplyr. È sufficiente utilizzare la stringa di formato data corrispondente per il mese %m o l'anno %Y nell'istruzione format.

set.seed(123) 
df <- data.frame(date = seq.Date(from =as.Date("01/01/1998", "%d/%m/%Y"), 
           to=as.Date("01/01/2000", "%d/%m/%Y"), by="day"), 
       value = sample(seq(5), 731, replace = TRUE)) 

head(df) 
     date value 
1 1998-01-01  2 
2 1998-01-02  4 
3 1998-01-03  3 
4 1998-01-04  5 
5 1998-01-05  5 
6 1998-01-06  1 

library(dplyr) 

df %>% 
mutate(month = format(date, "%m"), year = format(date, "%Y")) %>% 
group_by(month, year) %>% 
summarise(total = sum(value)) 

Source: local data frame [25 x 3] 
Groups: month [?] 

    month year total 
    (chr) (chr) (int) 
1  01 1998 105 
2  01 1999 91 
3  01 2000  3 
4  02 1998 74 
5  02 1999 77 
6  03 1998 96 
7  03 1999 86 
8  04 1998 91 
9  04 1999 95 
10 05 1998 93 
.. ... ... ... 
+0

ha funzionato come un incanto grazie –

+0

una cosa, come faccio a ottenere che il mese venga visualizzato come il nome del mese anziché il numero? –

+0

@Learning_R è necessario fornire un set riproducibile completo dei dati. Il tuo 'dput' è troncato quindi non posso ottenere i tuoi dati per riprodurre questo problema di etichetta dove il mio esempio fornisce i nomi. – cdeterman

1

Forse è solo aggiungere una colonna nei dati in questo modo:

Year <- format(as.Date(Entered_Date, "%d/%m/%Y"), "%Y")

+0

come farei se volessi il mese e l'anno, ad esempio 1/2000, 2/2000, ... –

+0

Modificare l'ultimo bit prima della parentesi su "% m /% Y" ... '? Strptime' ti fornirà una chiave per tutte queste opzioni di formattazione della data. –

1

Non abbia bisogno dplyr. Guardate ?as.POSIXlt

df$date<-as.POSIXlt(df$date) 
mon<-df$date$mon 
yr<-df$date$year 
monyr<-as.factor(paste(mon,yr,sep="/")) 
df$date<-monyr 

Non ha bisogno di usare ggplot2 ma è bello per questo genere di cose.

c <- ggplot(df, aes(factor(date))) 
c + geom_bar() 

Se volete vedere i numeri reali

aggregate(. ~ date,data = df,FUN=length) 
df2<-aggregate(. ~ date,data = df,FUN=length) 
df2 
    date value 
1 0/98 31 
2 0/99 31 
3 1/98 28 
4 1/99 28 
5 10/98 30 
6 10/99 30 
7 11/97  1 
8 11/98 31 
9 11/99 31 
10 2/98 31 
11 2/99 31 
12 3/98 30 
13 3/99 30 
14 4/98 31 
15 4/99 31 
16 5/98 30 
17 5/99 30 
18 6/98 31 
19 6/99 31 
20 7/98 31 
21 7/99 31 
22 8/98 30 
23 8/99 30 
24 9/98 31 
25 9/99 31 
0

C'è un modo super facile utilizzando la funzione di taglio():

list = as.Date(c("1998-5-2", "1993-4-16", "1998-5-10")) 
    cut(list, breaks = "month") 

ed otterrete questo:

[1] 1998-05-01 1993-04-01 1998-05-01 
    62 Levels: 1993-04-01 1993-05-01 1993-06-01 1993-07-01 1993-08-01 ... 1998-05-01