web-dev-qa-db-fra.com

Créer un histogramme de fréquence pour les variables de facteur

Je suis très nouveau chez R, alors je m'excuse pour une question aussi fondamentale. J'ai passé une heure à googler ce problème, mais je n'ai pas trouvé de solution.

Supposons que j'ai dans mon ensemble de données des données catégoriques sur des types d'animaux familiers courants. Je l’ai entré sous forme de vecteur de caractère dans R qui contient les noms de différents types d’animaux. Je l'ai créé comme ça: 

animals <- c("cat", "dog",  "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")

Je le transforme en facteur à utiliser avec d'autres vecteurs dans mon cadre de données:

animalFactor <- as.factor(animals)

Je souhaite maintenant créer un histogramme indiquant la fréquence de chaque variable sur l'axe des ordonnées, le nom de chaque facteur sur l'axe des x et contenant une barre pour chaque facteur. Je tente ce code:

hist(table(animalFactor), freq=TRUE, xlab = levels(animalFactor), ylab = "Frequencies")

La sortie n'est absolument pas comme je m'y attendais. Mis à part les problèmes d’étiquetage, je n'arrive pas à comprendre comment créer un histogramme de fréquence simple par catégorie. 

35
OnlyDean

Il semble que vous souhaitiez barplot(prop.table(table(animals))):

enter image description here

Cependant, ce n'est pas un histogramme.

58
Roland

Si vous souhaitez effectuer cela dans ggplot, une modification de l'API a été apportée à geom_histogram() qui entraîne une erreur: https://github.com/hadley/ggplot2/issues/1465

Pour résoudre ce problème, utilisez geom_bar():

animals <- c("cat", "dog",  "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")

library(ggplot2)
# counts
ggplot(data.frame(animals), aes(x=animals)) +
  geom_bar()

 enter image description here

18
Megatron

La raison pour laquelle vous obtenez un résultat inattendu est que hist(...) calcule la distribution à partir d'un vecteur numérique. Dans votre code, table(animalFactor) se comporte comme un vecteur numérique comportant trois éléments: 1, 3, 7. Donc, hist(...) trace le nombre de 1 (1), le nombre de 3 (1) et le nombre de 7 (1). La solution de @ Roland est la plus simple. 

Voici un moyen de faire cela en utilisant ggplot:

library(ggplot2)
ggp <- ggplot(data.frame(animals),aes(x=animals))
# counts
ggp + geom_histogram(fill="lightgreen")
# proportion
ggp + geom_histogram(fill="lightblue",aes(y=..count../sum(..count..)))

Vous obtiendrez exactement le même résultat en utilisant animalFactor au lieu de animals dans le code ci-dessus.

14
jlhoward

Pays est une variable catégorique et je veux voir combien d'occurrences de pays existent dans le jeu de données. En d’autres termes, combien d’enregistrements/participants proviennent de chaque pays 

barplot(summary(df$Country))
2
Mams_84

Les données en tant que facteur peuvent être utilisées en entrée de la fonction de tracé.

Une réponse à une question similaire a été donnée ici: https://stat.ethz.ch/pipermail/r-help/2010-December/261873.html

 x=sample(c("Richard", "Minnie", "Albert", "Helen", "Joe", "Kingston"),  
 50, replace=T)
 x=as.factor(x)
 plot(x)
1
rafaelvalle