2011-10-12 20 views
29

Sé cómo dibujar histogramas u otras tablas relacionadas con frecuencia/porcentaje. Pero ahora quiero saber cómo puedo obtener esos valores de frecuencia en una tabla para usar después del hecho.Obtener valores de frecuencia del histograma en R

Tengo un gran conjunto de datos, ahora dibujo un histograma con un ancho de conjunto establecido. Quiero extraer el valor de frecuencia (es decir, el valor en el eje y) que corresponde a cada ancho de banda y guardarlo en algún lugar.

¿Alguien puede ayudarme con esto? ¡Gracias!

Respuesta

18

De ?hist: Valor

un objeto de clase "histograma", que es una lista con los componentes:

  • rompe los límites n + 1 de células (= se rompe si que era un vector). Estas son las rupturas nominales, no con la fuzz de límite.
  • cuenta n enteros; para cada celda, el número de x [] adentro.
  • valores de densidad f^(x [i]), como valores de densidad estimados. Si todos (diff (breaks) == 1), son los recuentos de frecuencias relativas/n y en general satisfacen la suma [i; f^(x [i]) (b [i + 1] -b [i])] = 1, donde b [i] = breaks [i].
  • intensidades iguales a la densidad. Obsoleto, pero retenido para compatibilidad con .
  • atenúa los puntos medios de n cell.
  • xname una cadena de caracteres con el nombre real de argumento x.
  • equidista lógico, que indica si las distancias entre las roturas son todas iguales.

breaks y density proporcionan casi todo lo que necesita:

histrv<-hist(x) 
histrv$breaks 
histrv$density 
36

La función hist tiene un valor de retorno (un objeto de clase 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" 
+0

¡Aaaah, acaba de obtener la misma idea y quería publicar esto! Fuiste más rápido :-) – TMS

+6

También notarás que debería usar 'plot = FALSE', para que solo obtenga resultados sin trazar el histograma. – TMS

+0

¿hay alguna manera sin hist? Estoy tratando de hacer hist con pausas personalizadas y no funciona. ¿Podría haber algo más? – xealits

2

Por si alguien golpea esta pregunta con ggplot 's geom_histogram en cuenta, tenga en cuenta que hay una manera de extraer los datos de un objeto ggplot.

La siguiente función de comodidad da salida a una trama de datos con el límite inferior de cada bin (xmin), el límite superior de cada bin (xmax), el punto medio de cada bin (x), así como el valor de frecuencia (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") 

Ilustración:

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 

Una cuestión relacionada respondí aquí (Cumulative histogram with ggplot2).

Cuestiones relacionadas