2010-12-04 13 views
2

Je suis sûr que c'est simple mais je ne peux pas sembler juste pour le faire fonctionner. J'ai une trame de données qui représente les totaux quotidiens. Je veux simplement additionner les totaux par semaine, en retenant un zéro si une semaine n'est pas représentée. Quelle est la meilleure approche dans R? Dans le cas où il importe, je lis les données d'un fichier CSV et converties à une date une fois dans R.Données hebdomadaires agrégées dans R

Voici la structure de mon trame de données p1:

'data.frame': 407 obs. of 2 variables: 
$ date:Class 'Date' num [1:407] 14335 14336 14337 14340 14341 ... 
$ amt : num 45 150 165 165 45 45 150 150 15 165 ... 

et les quelques premiers ..

> head(p1) 
     date amt 
1 2009-04-01 45 
2 2009-04-02 150 
3 2009-04-03 165 
4 2009-04-06 165 
5 2009-04-07 45 
6 2009-04-08 45 

Merci beaucoup d'avance.

Une note: J'ai vu un précédent post mais n'a pas pu le faire fonctionner

+0

Essayez de convertir vos données en «zoo» ou en «xts». Aussi, s'il vous plaît poster la commande que vous essayez et la mauvaise sortie qu'elle donne. Je pense que si vous suivez les conseils de Shane, et que vous définissez également 'na.rm = T' après la somme de' 'sum '', cela devrait renvoyer 'NaN' pendant des semaines qui sont toutes' NA'. –

Répondre

2

Voici une solution qui lit les données, les agrégats par semaine et complète ensuite semaines manquantes avec zéro tout en 3 lignes de code. read.zoo le lit en supposant un en-tête et un séparateur de virgule. Il convertit la première colonne en classe Date, puis transforme la date au vendredi suivant. La fonction nextfri qui effectue cette transformation provient de la vignette zoo-quickref dans le package zoo. (Si vous voulez que la fin de semaine soit un autre jour de la semaine, remplacez simplement 5 par un autre jour.) La commande read.zoo regroupe également tous les points qui ont le même index (rappelez-vous que nous les avons transformés au dernier vendredi de la semaine donc tous les points dans la même semaine auront le même vendredi que leur index maintenant). La commande suivante crée un objet zoo de largeur nulle qui a les semaines du premier au dernier et fusionne avec la sortie de la lecture en utilisant fill = 0 afin que les semaines remplies obtiennent cette valeur.

Lines <- "date,amt 
2009-04-01,45 
2009-04-02,150 
2009-04-03,165 
2009-04-13,165 
2009-04-14,45 
2009-04-15,45" 
library(zoo) 
nextfri <- function(x) 7 * ceiling(as.numeric(x - 5 + 4)/7) + as.Date(5 - 4) 
z <- read.zoo(textConnection(Lines), header = TRUE, sep = ",", 
    FUN = as.Date, FUN2 = nextfri, aggregate = sum) 
merge(z, zoo(, seq(min(time(z)), max(time(z)), 7)), fill = 0) 

Nous avons utilisé ci-dessus textConnection(Lines) pour le rendre autonome afin que vous puissiez simplement copier ce et le coller directement dans votre session, mais en réalité textConnection(Lines) serait remplacé par le nom de votre fichier, par exemple "myfile.csv".

Pour l'entrée au-dessus de la sortie serait l'objet zoo suivant:

2009-04-03 2009-04-10 2009-04-17 
     360   0  255 

Il y a trois vignettes qui viennent avec le paquet de zoo que vous pouvez lire.

+0

C'est exactement ce que je cherche! Deux choses: Je reçois une erreur parce que je soupçonne que mes «dates» dans le fichier CSV sont jour/mois/année. J'ai vu dans l'aide que je peux passer ceci comme format "% d /% m /% Y" mais je ne suis pas sûr si cela cause l'erreur. Deuxièmement, j'aimerais que la semaine se termine dimanche et que le lundi commence une nouvelle semaine. Merci encore! – Btibert3

4

Une solution avec la bibliothèque lubridate:

library(lubridate) 
Lines <- "date,amt 
2009-04-01,45 
2009-04-02,150 
2009-04-03,165 
2009-04-13,165 
2009-04-14,45 
2009-04-15,45 
2009-05-15,45" 
df <- read.csv(textConnection(Lines)) 

Si vous n'avez pas besoin 0 pendant des semaines manquantes, il est simple:

weeks <- week(df$date) 
sums <- tapply(df$amt, weeks, sum) 
# 14 15 16 20 
#360 210 45 45 

Pour mettre des zéros pour les semaines manquantes:

span <- min(weeks):max(weeks) 
out <- array(0, dim = length(span), dimnames = list(span)) 
out[dimnames(sums)[[1]]] <- sums 
# 14 15 16 17 18 19 20 
#360 210 45 0 0 0 45 
Questions connexes