2017-02-06 1 views
1

Je suis novice dans l'analyse des séries chronologiques et j'utilise xts (et R en général), donc veuillez pardonner la nature de base de la question.Agréger des données dans un objet xts par l'heure et la seconde variable (facteur)

Je veux agréger les données par une trame de temps (par exemple des mois) et par une seconde variable de facteur. Pour illustrer ma question, s'il vous plaît voir le suivant:

require(xts) 

# Create example df and convert it to an xts object 

date <- sample(seq(as.Date("2015/01/01"), as.Date("2016/12/31"), by="day"),12) 
colour <- c("Red", "Red", "Blue", "Blue", "Blue", "Blue", "Red", "Red", "Red", 
      "Red", "Blue", "Blue") 
value <- sample(1:10, 12, replace = TRUE) 
df <- cbind.data.frame(date, colour, value) 
df <- xts(df[,-1], order.by = df$date) 

Cela crée une trame de données d'échantillon qui ressemble à ceci:

  colour value 
2015-01-30 "Blue" "2" 
2015-03-15 "Blue" "9" 
2015-03-22 "Blue" "9" 
2015-08-13 "Blue" "5" 
2015-09-01 "Blue" "8" 
2015-11-10 "Red" "7" 
2016-04-26 "Blue" "2" 
2016-07-06 "Red" "9" 
2016-07-07 "Red" "6" 
2016-07-08 "Red" "2" 
2016-10-01 "Red" "6" 
2016-11-07 "Red" "2" 

Je peux résumer la variable "valeur" à l'aide:

apply.monthly(df$value, FUN = mean) 

Pour me donner:

   value 
2015-01-30 2.000000 
2015-03-22 9.000000 
2015-08-13 5.000000 
2015-09-01 8.000000 
2015-11-10 7.000000 
2016-04-26 2.000000 
2016-07-08 5.666667 
2016-10-01 6.000000 
2016-11-07 2.000000 

Mais je ne peux pas vraiment voir comment agréger par (dans ce cas) la variable de couleur (je voudrais la somme de chaque couleur par mois). Toute aide serait grandement appréciée.

Répondre

1

Que pensez-vous de cela?

aggregate(as.numeric(df$value), 
      list(Month = format(index(df), "%Y-%m"), 
       Colour = df$colour), 
      mean) 

En réponse à votre commentaire ci-dessous:

# You can replace the format with the following to get a year month object 
zoo::as.yearmon(index(df)) 

# Or you can covert to date by using the first of every month 
as.Date(paste(format(index(df), "%Y-%m"), "-01", sep = "")) 

Vous trouverez peut-être des idées ici: Converting year and month ("yyyy-mm" format) to a date in R?

+0

Très utile @NBATrends Thi s solution fonctionne mais crée une variable "Month" qui est la classe "Character". Y a-t-il un moyen de s'assurer que la sortie reste en classe "Date"? J'ai essayé 'as.Date (df $ Month, format ="% Y-% m ")' mais en vain. Apprécier ton aide. – drgregmartin

2

Si vous voulez travailler avec des objets XTS après subsetting par la couleur, il est facile de travailler avec chaque série chronologique (par couleur) séparément dans une liste comme celle-ci:

df <- cbind.data.frame(date, colour, value) 

> class(df) 
#[1] "data.frame" 

# data.frame split (not xts split) to separate data by colour in a list object: 
l_out <- split(df, colour) 

> class(l_out[[1]]) 
[1] "data.frame" 

mthly_mean <- function(x) { 
    apply.monthly(as.xts(x[, "value"], x[, "date"]), mean)  
} 

# Each element in the list is an xts object (not a data.frame) containing the mean of the data for each month: 
l_res <- lapply(l_out, FUN = mthly_mean) 
# or more succinctly: 
# l_res <- lapply(l_out, FUN = function(x) apply.monthly(as.xts(x[, "value"], x[, "date"]), mean)) 

> l_res 
# $Blue 
# [,1] 
# 2015-01-15 8.0 
# 2015-07-21 4.5 
# 2016-01-28 5.0 
# 2016-04-28 4.0 
# 2016-05-08 2.0 
# 
# $Red 
# [,1] 
# 2015-11-30 3 
# 2016-01-18 7 
# 2016-02-25 5 
# 2016-04-17 1 
# 2016-05-23 6 
# 2016-07-14 5 

> class(l_res[[1]]) 
[1] "xts" "zoo"