R: Quelles sont les meilleures fonctions pour traiter les concaténer et la moyenne des valeurs dans un data.frame?

StackOverflow https://stackoverflow.com/questions/2473659

Question

J'ai un data.frame de ce code:

   my_df = data.frame("read_time" = c("2010-02-15", "2010-02-15", 
                                      "2010-02-16", "2010-02-16", 
                                       "2010-02-16", "2010-02-17"), 
                      "OD" = c(0.1, 0.2, 0.1, 0.2, 0.4, 0.5) )

qui produit ceci:

> my_df
   read_time  OD
1 2010-02-15 0.1
2 2010-02-15 0.2
3 2010-02-16 0.1
4 2010-02-16 0.2
5 2010-02-16 0.4
6 2010-02-17 0.5

Je veux en moyenne la colonne OD sur chaque read_time distincte (remarquez certains sont répliquées d'autres ne sont pas) et je voudrais également calculer l'écart type, la production d'une table comme ceci:

> my_df
   read_time  OD        stdev
1 2010-02-15 0.15       0.05
5 2010-02-16 0.3         0.1
6 2010-02-17 0.5         0

Quelles sont les meilleures fonctions pour faire face à concaténer des valeurs dans un data.frame?

Était-ce utile?

La solution

Le plyr package est populaire pour cela, mais les fonctions de base by() et aggregate() également aider.

> ddply(my_df, "read_time", function(X) data.frame(OD=mean(X$OD),stdev=sd(X$OD)))
   read_time      OD   stdev
1 2010-02-15 0.15000 0.07071
2 2010-02-16 0.23333 0.15275
3 2010-02-17 0.50000      NA

Vous pouvez ajouter le bit manquant à retourner 0 au lieu de NA pour la dernière std.dev.

, vous n'avez pas besoin les guillemets (sur les variables) que vous aviez dans la construction data.frame.

Autres conseils

Vous pouvez essayer le package data.table. Si vous connaissez MySQL, il devrait être très facile pour vous d'obtenir toutes les fonctions, sinon les bases sont assez bien aussi; -)

my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<-  ..  

vous pouvez également joindre à la fois dans une ligne ou cbind à la fin, l'appel du style

Un autre avantage: il est extrêmement rapide, si vous avez de grands échantillons. Très vite ... voir la documentation pourquoi.

Ceci illustre comment vous pouvez utiliser aggregate pour obtenir la moyenne et l'écart type par votre read_time.

>aggregate(my_df$OD, by=list(my_df$read_time), function(x) mean(x))

     Group.1         x
1 2010-02-15 0.1500000
2 2010-02-16 0.2333333
3 2010-02-17 0.5000000


>aggregate(my_df$OD, by=list(my_df$read_time), function(x) sd(x))
     Group.1          x
1 2010-02-15 0.07071068
2 2010-02-16 0.15275252
3 2010-02-17         NA
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top