2011-10-15 3 views
2

J'ai un jeu de données du formulaire suivant.Agréger par année et par mois pour une variable POSIX

 country   datetime  x 
1 United States 2008-01-01 00:00:00 5962.06 
2 United States 2008-01-02 00:00:00 6002.74 
3 United States 2008-01-03 00:00:00 6040.98 
4 United States 2008-01-04 00:00:00 6031.44 
5 United States 2008-01-05 00:00:00 6029.91 
6 United States 2008-01-06 00:00:00 6025.24 

Pour moi le temps (heures, minutes, secondes) et les jours de la semaine ne sont pas pertinentes, mais je veux agréger les valeurs de variable « x » par country, année et mois. Y a-t-il un moyen simple de faire cela?

+0

Cela va dépendre de t La classe des colonnes "pays" et "datatime". Nous pouvons deviner que "country" est une variable factorielle et que "datatime" est POSIXct, mais il serait préférable que vous affichiez str() sur l'objet. En l'absence de directives de votre part, nous devrons également deviner à quel type d'agrégation vous voulez participer. Somme? Signifier? Max? –

Répondre

4

La méthode la plus simple consiste à utiliser strftime pour formater votre datetime en tant que vecteur de caractères contenant uniquement l'année et le mois.

En supposant que votre colonne datetime est de classe POSIXct, et que votre data.frame est appelé dat:

dat$shortdate <- strftime(dat$datetime, format="%Y/%m") 
dat 
     country datetime  x shortdate 
1 United States 2008-01-01 5962.06 2008/01 
2 United States 2008-01-02 6002.74 2008/01 
3 United States 2008-01-03 6040.98 2008/01 
4 United States 2008-01-04 6031.44 2008/01 
5 United States 2008-01-05 6029.91 2008/01 
6 United States 2008-01-06 6025.24 2008/01 

Alors c'est une question simple à utiliser votre méthode d'agrégation préférée pour résumer les données. Par exemple, en utilisant plyr:

library(plyr) 
ddply(dat, .(shortdate), summarize, mean_x=mean(x)) 

    shortdate mean_x 
1 2008/01 6015.395 
+0

Parfait. Parfait! Merci, Andrie. Juste par curiosité, y a-t-il un moyen d'analyser par année, mois et semaine? – user702432

+0

Vous pouvez facilement spécifier le numéro de semaine (c'est-à-dire que la première semaine de janvier est 1, la dernière semaine de décembre est ~ 52) avec "% U" ou "% W". Les options sont décrites au bas de la page d'aide de '? Strptime' – Andrie

+0

Plus utile. Merci beaucoup. – user702432

1

Étant donné la meilleure solution de Andrie ce sera principalement un exercice dans l'illustration POSIXlt. En utilisant les hypothèses sur les classes de vos variables mentionnées ci-dessus et en utilisant mean comme la fonction d'agrégation:

aggregate(dfrm$x, list(dfrm$country, as.POSIXlt(dfrm$datetime)$year, 
         as.POSIXlt(dfrm$datetime)$mon), FUN=mean) 
     Group.1 Group.2 Group.3  x 
1 United States  108  0 6015.395 

Notez que l'on pourrait ajouter 1900 à la valeur de l'année POSIXlt pour récupérer un an et utiliser la valeur du mois comme un indice en le vecteur constant R 'month.abb', et en ajoutant des étiquettes de colonne agréable:

aggregate(dfrm$x, list(Country=dfrm$country, 
         Year=1900+as.POSIXlt(dfrm$datetime)$year, 
         Month=month.abb[1+as.POSIXlt(dfrm$datetime)$mon]), 
FUN=mean) 
     Country Year Month  x 
1 United States 2008 Jan 6015.395 
1

Vous pouvez utiliser zoo::as.yearmon:

aggregate(x ~ country * as.yearmon(datetime), FUN=mean, data=dat) 

as.yearmon(datetime)  country  x 
1    ene 2008 United States 6015.395 
Questions connexes