web-dev-qa-db-fra.com

Comment générer un histogramme pour chaque colonne de ma table?

J'ai un tableau de données avec une colonne représentant une valeur de laboratoire pour chaque sujet d'étude (lignes). 

Je veux générer une série d'histogrammes montrant la distribution des valeurs pour chaque test de laboratoire (c'est-à-dire une colonne). Chaque ensemble de valeurs de laboratoire aurait idéalement une largeur de casier différente (certains sont des entiers avec une plage de centaines, d'autres sont numériques avec une plage de 2-3).

Comment je fais ça?

6
veldhoen

Si vous combinez les packages tidyr et ggplot2, vous pouvez utiliser facet_wrap pour créer un ensemble rapide d'histogrammes de chaque variable dans votre data.frame.

Vous devez modifier la forme de vos données pour qu'elles soient longues avec tidyr::gather, afin que vous ayez des colonnes key et value comme ceci:

library(tidyr)
library(ggplot2)
# or `library(tidyverse)`

mtcars %>% gather() %>% head()
#>   key value
#> 1 mpg  21.0
#> 2 mpg  21.0
#> 3 mpg  22.8
#> 4 mpg  21.4
#> 5 mpg  18.7
#> 6 mpg  18.1

En utilisant cela comme nos données, nous pouvons mapper value comme notre variable x et utiliser facet_wrap pour séparer par la colonne key:

ggplot(gather(mtcars), aes(value)) + 
    geom_histogram(bins = 10) + 
    facet_wrap(~key, scales = 'free_x')

Le scales = 'free_x' est nécessaire à moins que vos données ne soient toutes d'une échelle similaire.

Vous pouvez remplacer bins = 10 par tout ce qui correspond à un nombre, ce qui peut vous permettre de les définir un peu individuellement avec un peu de créativité. Vous pouvez également définir binwidth, ce qui peut être plus pratique, en fonction de l'apparence de vos données. Quoi qu'il en soit, le binning prendra un peu de finesse.

19
alistaire

Vous pouvez générer les tracés dans une boucle for avec quelque chose comme ceci, si votre trame de données s'appelle "df" et que vous souhaitez générer des histogrammes commençant par la colonne 2 (si la colonne 1 est votre identifiant):

for (col in 2:ncol(df)) {
    hist(df[,col])
}

La fonction hist calcule automatiquement une largeur de bac raisonnable, ou vous pouvez spécifier un nombre fixe de bacs pour tous les histogrammes en ajoutant l'argument break:

hist(df[,col], breaks=10)

Si vous utilisez RStudio, tous vos graphiques seront automatiquement enregistrés dans le volet Graphiques. Sinon, vous devrez enregistrer chaque tracé dans un fichier distinct à l'intérieur de la boucle, comme expliqué ici: http://www.r-bloggers.com/automatically-save-your-plots-to-a-folder/

5
Katia

Je viens de tomber sur la fonction multi.hist () du paquet psych . Il vous permet de tracer rapidement des histogrammes en fonction de colonnes spécifiques et semble vous permettre de définir différentes ruptures pour chaque colonne.

0
kitkat