J'ai un cadre de données R comme ceci:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Je dois obtenir un bloc de données sous la forme suivante:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
Le numéro de groupe peut varier, mais vous pouvez obtenir leur nom et leur quantité en appelant le levels(factor(data$group))
Quelles manipulations faut-il faire avec les données pour obtenir le résultat?
r
data-transformation
Yuriy Petrovskiy
la source
la source
aggregate
,tapply
puis stackoverflow.com pour toute question de codage ultérieure de ce type.Réponses:
Voici la variante plyr one line utilisant ddply :
Voici une autre variante d'une ligne utilisant le nouveau package data.table .
Celui-ci est plus rapide, bien que cela ne se remarque que sur les tables de 100 000 lignes. Timings sur mon Macbook Pro avec processeur Core 2 Duo de 2,53 Ghz et R 2.11.1:
Des économies supplémentaires sont possibles si nous utilisons
setkey
:la source
dt <- data.table(dtf)
au lieu dedt <- data.table(dt)
dans le deuxième bloc de code. Ainsi, vous créez la table de données à partir d'un bloc de données et non à partir de ladt
fonction dustats
package. J'ai essayé de le modifier, mais je ne peux pas modifier moins de six caractères.data.table
c’est le meilleur moyen d’agréger les données et cette réponse est excellente, mais ne fait qu’effleurer la surface. En plus d'être syntaxiquement supérieur, il est également extrêmement flexible et possède de nombreuses fonctionnalités avancées qui impliquent des jointures et des mécanismes internes. Consultez la FAQ, la page github ou le cours pour plus d'informations.Une possibilité consiste à utiliser la fonction d'agrégat . Par exemple,
vous donne la deuxième colonne du résultat souhaité.
la source
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
mais je ne suis pas sûr que c'est la bonne façon. Je ne suis pas sûr de ce qui va arriver alors les résultats des colonnes liées seront dans un ordre différent (je pense que c'est possible). Quel est ton avis?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Comme vous manipulez un cadre de données, le
dplyr
package est probablement le moyen le plus rapide de le faire.ou de manière équivalente, en utilisant l' opérateur
dplyr
/magrittr
pipe:EDIT toute utilisation de l’opérateur de pipe:
la source
dplyr
. Il a simplifié de nombreuses tâches R et rendu obsolètes nombre de ces méthodes.plyr
place dudplyr
problème.Génial, merci bquast d'avoir ajouté la solution Dplyr!
Il s'avère que dplyr et data.table sont très proches:
data.table est toujours le plus rapide, suivi de très près par dplyr (), qui semble intéressant plus rapidement sur le data.frame que le data.table:
la source
En plus des suggestions existantes, vous souhaiterez peut-être vérifier la
describe.by
fonction dans lepsych
package.Il fournit un certain nombre de statistiques descriptives, notamment la moyenne et l’écart-type, en fonction d’une variable de regroupement.
la source
J'ai trouvé que la fonction
summaryBy
du paquet doBy était la plus pratique pour cela:la source
Utilisez le
sqldf
paquet. Cela vous permet maintenant d'utiliser SQL pour résumer les données. Une fois que vous l'avez chargé, vous pouvez écrire quelque chose comme:la source
Edité: selon les suggestions de chl
La fonction que vous recherchez s'appelle "tapply" et applique une fonction par groupe spécifiée par un facteur.
Je suggère vraiment de travailler à travers un tutoriel de base R expliquant toutes les infrastructures de données et méthodes couramment utilisées. Sinon, vous resterez coincé à chaque instant pendant la programmation. Voir cette question pour une collection de ressources gratuites disponibles.
la source
for
boucle n'est nécessaire ici, vous pouvez contrôler votre dataframe en ligne, IMO. Pour l'tapply
appel, utilisezfunction(x) c(mean(x),sd(x)))
etcbind
le résultat car le PO a demandé les deux statistiques. En outre,ddply
du paquet plyr pourrait le faire en douceur.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (groupe = niveaux (facteur (groupe $ données)), "moyenne" = mperage, "stdev" = stperage) `correct?Voici un exemple avec la fonction que
aggregates()
j'ai moi-même créée il y a quelque temps:Cela donne le résultat suivant:
Vous pouvez peut-être obtenir le même résultat à partir de la fonction R split ():
Permettez-moi de revenir à la sortie de la
aggregates
fonction. Vous pouvez le transformer en une belle table en utilisantreshape()
,xtabs()
etftable()
:Cela donne:
Beau, n'est ce pas? Vous pouvez exporter cette table vers un pdf avec la
textplot()
fonction dugplots
package.Voir ici pour les solutions des autres.
la source