63 votes

Agréger les données quotidiennes aux intervalles de mois/année

Je n'ai pas souvent à travailler avec des dates dans R, mais j'imagine que c'est assez facile. J'ai une colonne qui représente une date dans un dataframe. Je veux simplement créer une nouvelle base de données qui résume une 2ème colonne par mois/année en utilisant la date. Quelle est la meilleure approche?

Je veux une deuxième trame de données pour pouvoir l'alimenter dans un tracé.

Toute aide que vous pouvez fournir sera grandement appréciée!

EDIT : Pour référence :

 > str(temp)
'data.frame':   215746 obs. of  2 variables:
 $ date  : POSIXct, format: "2011-02-01" "2011-02-01" "2011-02-01" ...
 $ amount: num  1.67 83.55 24.4 21.99 98.88 ...

> head(temp)
        date amount
1 2011-02-01  1.670
2 2011-02-01 83.550
3 2011-02-01 24.400
4 2011-02-01 21.990
5 2011-02-03 98.882
6 2011-02-03 24.900

58voto

hadley Points 33766

Je le ferais avec lubridate et plyr , en arrondissant les dates au mois le plus proche pour les rendre plus faciles à tracer :

 library(lubridate)
df <- data.frame(
  date = today() + days(1:300),
  x = runif(300)
)
df$my <- floor_date(df$date, "month")

library(plyr)
ddply(df, "my", summarise, x = mean(x))

40voto

kmm Points 1541

Il existe probablement une solution plus élégante, mais diviser en mois et en années avec strftime() puis aggregate() ing devrait le faire. Remontez ensuite la date pour le tracé.

 x <- as.POSIXct(c("2011-02-01", "2011-02-01", "2011-02-01"))
mo <- strftime(x, "%m")
yr <- strftime(x, "%Y")
amt <- runif(3)
dd <- data.frame(mo, yr, amt)

dd.agg <- aggregate(amt ~ mo + yr, dd, FUN = sum)
dd.agg$date <- as.POSIXct(paste(dd.agg$yr, dd.agg$mo, "01", sep = "-"))

9voto

Galina Alperovich Points 602

Vous pouvez le faire comme :

 short.date = strftime(temp$date, "%Y/%m")
aggr.stat = aggregate(temp$amount ~ short.date, FUN = sum)

8voto

Galina Alperovich Points 602

Utilisez simplement le package xts pour cela.

 library(xts)
ts <- xts(temp$amount, as.Date(temp$date, "%Y-%m-%d"))

# convert daily data
ts_m = apply.monthly(ts, FUN)
ts_y = apply.yearly(ts, FUN)
ts_q = apply.quarterly(ts, FUN)

où FUN est une fonction avec laquelle vous agrégez des données (par exemple somme)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X