R: Quelles sont les meilleures fonctions pour traiter les concaténer et la moyenne des valeurs dans un data.frame?
-
20-09-2019 - |
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?
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