2010-09-01 11 views
3

Je suis tenté d'agréger (ce que certains erratiques) données quotidiennes. Je travaille actuellement avec des données csv, mais si je le recréer - il ressemblerait à quelque chose comme ceci:Agrégation contenu quotidien

library(zoo) 

dates <- c("20100505", "20100505", "20100506", "20100507") 
val1 <- c("10", "11", "1", "6") 
val2 <- c("5", "31", "2", "7") 

x <- data.frame(dates = dates, val1=val1, val2=val2) 
z <- read.zoo(x, format = "%Y%m%d") 

Maintenant, je voudrais regrouper sur une base quotidienne (notez que certaines fois il y a> 1 pour une journée du point de données, et parfois il ne coûtent pas

J'ai essayé beaucoup, beaucoup de variations, mais je ne peux pas semblent agréger, de sorte que, par exemple, cela ne fonctionne pas.

aggregate(z, as.Date(time(z)), sum) 
# Error in Summary.factor(2:3, na.rm = FALSE) : sum not meaningful for factors 

Il semble y avoir beaucoup de contenu concernant l'agrégat, et j'ai essayé un certain nombre de versions, mais ne peux pas sembler résumer cela sur un niveau quotidien. Je voudrais également courir cummax et moyennes cumulatives en plus de la somme quotidienne.

Toute aide serait grandement appréciée.

Mise à jour

Le code que je suis en fait en utilisant est la suivante:

z <- read.zoo(file = "data.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE, blank.lines.skip = T, na.strings="NA", format = "%Y%m%d"); 

Il semble ma citation (non intentionnelle) des chiffres ci-dessus est similaire à ce qui se passe dans la pratique, parce que quand je fais:

aggregate(z, index(z), sum) 
#Error in Summary.factor(25L, na.rm = FALSE) : sum not meaningful for factors 

ya un certain nombre de colonnes (100 si), comment puis-je les spécifier pour être as.numérique automatiquement? (stringAsFactors = False ne marche pas semblent fonctionner?)

Répondre

5

Ou vous regroupez avant d'utiliser le zoo (val1 et val2 doivent être numériques bien).

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2)) 
y <- aggregate(x[,2:3],by=list(x[,1]),FUN=sum) 

puis nourrir y dans le zoo.

Vous éviter l'avertissement :)

+0

Doux - J'ai été capable de faire fonctionner cela aussi pour les données CSV (finalement :) merci! – Malang

4

Vous avez commencé sur le bon chemin, mais a fait quelques erreurs.

Tout d'abord, le zoo ne consomme que des matrices, non data.frames. D'autre part, ceux qui ont besoin numériques Entrées:

> z <- zoo(as.matrix(data.frame(val1=c(10,11,1,6), val2=c(5,31,2,7))), 
+   order.by=as.Date(c("20100505","20100505","20100506","20100507"), 
+       "%Y%m%d")) 
Warning message: 
In zoo(as.matrix(data.frame(val1 = c(10, 11, 1, 6), val2 = c(5, : 
    some methods for "zoo" objects do not work if the index entries in 
    'order.by' are not unique 

Cela nous reçoit un avertissement qui est la norme dans le zoo: il n'aime pas les indices de temps identiques.

toujours une bonne idée de montrer la structure de données, peut-être via str() ainsi, courir peut-être summary() sur elle:

> z 
      val1 val2 
2010-05-05 10 5 
2010-05-05 11 31 
2010-05-06 1 2 
2010-05-07 6 7 

Et puis, une fois que nous l'avons, l'agrégation est facile:

> aggregate(z, index(z), sum) 
      val1 val2 
2010-05-05 21 36 
2010-05-06 1 2 
2010-05-07 6 7 
> 
+1

Mais 'zoo' consumé ma data.frame! (parce que 'read.zoo' fonctionne sur data.frames) ;-) –

+0

Merci - Je pense que je suis à deux pas plus près maintenant :) fait une erreur idiote en citant les chiffres là-bas, quand je faisais l'exemple, mais en fait, il me semble que ce qui se passe dans le code de la vie réelle aussi. J'ai mis à jour la question, en ayant encore un peu de problème .. – Malang

1

val1 et val2 sont des chaînes de caractères. data.frame() les convertit en facteurs. La somme des facteurs n'a pas de sens. Vous avez probablement l'intention:

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2)) 
z <- read.zoo(x, format = "%Y%m%d") 
aggregate(z, as.Date(time(z)), sum) 

qui donne:

  val1 val2 
2010-05-05 21 36 
2010-05-06 1 2 
2010-05-07 6 7 
+0

Merci Joshua - est-il possible de les spécifier tous comme.numérique (si l'importation d'un csv?) J'ai mis à jour la question, je suppose que le premier était trop simplifié :) – Malang

1

Convertir les colonnes de caractères à utiliser numérique, puis read.zoo faisant usage de son argument aggregate:

> x[-1] <- lapply(x[-1], function(x) as.numeric(as.character(x))) 
> read.zoo(x, format = "%Y%m%d", aggregate = sum) 
      val1 val2 
2010-05-05 21 36 
2010-05-06 1 2 
2010-05-07 6 7