web-dev-qa-db-fra.com

Obtention des valeurs de fréquence à partir de l'histogramme dans R

Je sais comment dessiner des histogrammes ou d'autres tableaux liés à la fréquence/pourcentage. Mais maintenant, je veux savoir, comment puis-je obtenir ces valeurs de fréquence dans un tableau à utiliser après coup.

J'ai un énorme ensemble de données, maintenant je dessine un histogramme avec une largeur de bin définie. Je veux extraire la valeur de fréquence (c'est-à-dire la valeur sur l'axe des y) qui correspond à chaque binwidth et l'enregistrer quelque part.

Quelqu'un pourrait m'aider avec ça? Je vous remercie!

36
MiMi

La fonction hist a une valeur de retour (un objet de classe histogram):

R> res <- hist(rnorm(100))
R> res
$breaks
[1] -4 -3 -2 -1  0  1  2  3  4

$counts
[1]  1  2 17 27 34 16  2  1

$intensities
[1] 0.01 0.02 0.17 0.27 0.34 0.16 0.02 0.01

$density
[1] 0.01 0.02 0.17 0.27 0.34 0.16 0.02 0.01

$mids
[1] -3.5 -2.5 -1.5 -0.5  0.5  1.5  2.5  3.5

$xname
[1] "rnorm(100)"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"
46
rcs

De ?hist: Valeur

un objet de classe "histogramme" qui est une liste avec des composants:

  • rompt les limites des cellules n + 1 (= rompt si c'était un vecteur). Ce sont les ruptures nominales, pas avec les fuzz limites.
  • compte n entiers; pour chaque cellule, le nombre de x [] à l'intérieur.
  • valeurs de densité f ^ (x [i]), en tant que valeurs de densité estimées. Si tous (diff (breaks) == 1), ce sont les fréquences relatives comptes/n et en général satisfont la somme [i; f ^ (x [i]) (b [i + 1] -b [i])] = 1, où b [i] = rompt [i].
  • intensités identiques à la densité. Obsolète, mais conservé pour des raisons de compatibilité.
  • au milieu des n cellules médianes.
  • xname une chaîne de caractères avec le nom d'argument x réel.
  • logique équidiste, indiquant si les distances entre les pauses sont toutes les mêmes.

breaks et density fournissent à peu près tout ce dont vous avez besoin:

histrv<-hist(x)
histrv$breaks
histrv$density
20
Nick Sabbe

Juste au cas où quelqu'un toucherait cette question avec ggplot's geom_histogram à l'esprit, notez qu'il existe un moyen d'extraire les données d'un objet ggplot.

La fonction de commodité suivante génère une trame de données avec la limite inférieure de chaque bac (xmin), la limite supérieure de chaque bac (xmax), le milieu de chaque bac (x), ainsi que la valeur de fréquence (y).

## Convenience function
get_hist <- function(p) {
    d <- ggplot_build(p)$data[[1]]
    data.frame(x = d$x, xmin = d$xmin, xmax = d$xmax, y = d$y)
}

# make a dataframe for ggplot
set.seed(1)
x = runif(100, 0, 10)
y = cumsum(x)
df <- data.frame(x = sort(x), y = y)

# make geom_histogram 
p <- ggplot(data = df, aes(x = x)) + 
    geom_histogram(aes(y = cumsum(..count..)), binwidth = 1, boundary = 0,
                color = "black", fill = "white")

Illustration:

hist = get_hist(p)
head(hist$x)
## [1] 0.5 1.5 2.5 3.5 4.5 5.5
head(hist$y)
## [1]  7 13 24 38 52 57
head(hist$xmax)
## [1] 1 2 3 4 5 6
head(hist$xmin)
## [1] 0 1 2 3 4 5

Une question connexe à laquelle j'ai répondu ici ( histogramme cumulatif avec ggplot2 ).

3
PatrickT