2010-08-19 11 views
2

j'ai les données suivantes lu dans R en tant que trame de données nommé « data_old »:écrit le résultat d'une boucle imbriquée à un objet vectoriel en R

yes year month 
1 15 2004  5 
2 9 2005  6 
3 15 2006  3 
4 12 2004  5 
5 14 2005  1 
6 15 2006  7 
. . ...  . 
. . ...  . 

J'ai écrit une petite boucle qui passe par la données et résume la variable oui pour chaque mois/année combinaison:

year_f <- c(2004:2006) 
month_f <- c(1:12) 

for (i in year_f){ 
    for (j in month_f){ 
     x <- subset(data_old, month == j & year == i, select="yes") 
     if (nrow(x) > 0){ 
      print(sum(x)) 
      } 
     else{print("Nothing")} 
     } 
    } 

Ma question est la suivante: je peux imprimer la somme pour chaque mois/année combinaison dans le terminal, mais comment puis-je stocker dans un vecteur ? (La boucle imbriquée me donne des maux de tête en essayant de comprendre cela).

Thomas

Répondre

7

Une autre façon,

library(plyr) 
ddply(data_old,.(year,month),function(x) sum(x[1])) 

    year month V1 
1 2004  5 27 
2 2005  1 14 
3 2005  6 9 
4 2006  3 15 
5 2006  7 15 
+3

ou 'ddply (. Data_old, (année, mois), résumer, oui = somme (oui))' – JoFrhwld

+0

Cheers, a travaillé magnifiquement! –

6

Oublier les boucles, vous souhaitez utiliser une fonction d'agrégation. Il y a une discussion récente d'eux dans this SO question.

with(data_old, tapply(yes, list(year, month), sum)) 

est l'une des nombreuses solutions.

De même, vous n'avez pas besoin d'utiliser c() lorsque vous ne concaténéz rien. Plain 1:12 est très bien.

3

Juste pour ajouter une troisième option:

aggregate(yes ~ year + month, FUN=sum, data=data_old) 
+0

OMI, c'est comme ça que ça doit être fait. C'est plus clair pour le programmeur moyen: nous sommes en train d'agréger, pas de "dupliquer". – Vince

+1

C'est un bon moyen de résoudre ce problème, mais mon cerveau ne correspond pas à toutes les options pour d'autres problèmes. La bonne chose à propos de plyr est que je me souviens juste du motif: split/operation/merge. ddply est la bonne fonction si je divise un data.frame en fonction de certaines colonnes et construit un nouveau data.frame sur les résultats d'une opération sur les pièces. – Harlan