Supposons que je veuille calculer la proportion de valeurs différentes dans chaque groupe. Par exemple, en utilisant les mtcars
données, comment calculer la fréquence relative du nombre de vitesses par heure (automatique / manuel) en une seule fois dplyr
?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
Ce que je souhaite réaliser:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
prop.table()
/sweep()
. De plus, dans d'autres questions, certaines personnes demandent la possibilité d'inclure des comptes nuls pour les variables ou les interactions de variablesRéponses:
Essaye ça:
À partir de la vignette dplyr :
Ainsi, après le
summarise
, la dernière variable de regroupement spécifiée dansgroup_by
«vitesse» est détachée. Dans l'mutate
étape, les données sont regroupées par la ou les variables de regroupement restantes, ici «am». Vous pouvez vérifier le regroupement à chaque étape avecgroups
.Le résultat du pelage dépend bien sûr de l'ordre des variables de regroupement dans l'
group_by
appel. Vous voudrez peut-être faire un suivantgroup_by(am)
, pour rendre votre code plus explicite.Pour arrondir et embellir, veuillez vous référer à la belle réponse de @Tyler Rinker.
la source
sum(n)
travaille sur leam
groupe et pas aussi sur legear
groupe ...summarise
cela indique quels groupes il reste. Oh dplyr rocks ...Vous pouvez utiliser la
count()
fonction, qui a cependant un comportement différent selon la version dedplyr
:dplyr 0.7.1: renvoie une table non groupée : vous devez à nouveau grouper par
am
dplyr <0.7.1: renvoie une table groupée , donc pas besoin de regrouper à nouveau, même si vous voudrez peut-être le faire
ungroup()
pour des manipulations ultérieuresdplyr 0.7.1
dplyr <0.7.1
Cela donne un tableau groupé , si vous souhaitez l'utiliser pour une analyse plus approfondie, il peut être utile de supprimer l' attribut groupé avec
ungroup()
.la source
dplyr
0.7.1. Il fait le calcul de la fréquence globalement sur "gear", au lieu de chaque niveau de "am".@ Henrik est meilleur pour la convivialité car cela rendra le caractère de la colonne et non plus numérique mais correspond à ce que vous avez demandé ...
EDIT Parce que Spacedman l'a demandé :-)
la source
format
méthode qui ajoute un signe de pourcentage ... #overkillVoici une fonction générale implémentant la solution de Henrik sur
dplyr
0.7.1.la source
Error in bind_rows_(x, .id) : Column
am` ne peut pas être converti de numérique en caractère`J'ai écrit une petite fonction pour cette tâche répétitive:
Je peux ensuite l'utiliser comme:
Il renvoie:
la source
Malgré les nombreuses réponses, une autre approche qui utilise
prop.table
en combinaison avecdplyr
oudata.table
.la source
Cette réponse est basée sur la réponse de Matifou.
Tout d'abord, je l'ai modifié pour m'assurer que la colonne freq ne soit pas renvoyée en tant que colonne de notation scientifique en utilisant l'option scipen.
Ensuite, je multiplie la réponse par 100 pour obtenir un pourcentage plutôt qu'une décimale afin de rendre la colonne freq plus facile à lire en pourcentage.
la source