2011-10-12 14 views
29

So come disegnare istogrammi o altre tabelle relative alla frequenza/percentuale. Ma ora voglio sapere, come posso ottenere quei valori di frequenza in una tabella da usare dopo il fatto.Ottenere valori di frequenza dall'istogramma in R

Ho un enorme set di dati, ora disegno un istogramma con una larghezza di banda impostata. Voglio estrarre il valore di frequenza (cioè il valore sull'asse y) che corrisponde a ciascuna larghezza di banda e salvarlo da qualche parte.

Qualcuno può aiutarmi con questo? Grazie!

risposta

18

Da ?hist: Valore

un oggetto della classe "istogramma", che è un elenco di componenti:

  • rompe i confini n + 1 di cellule (= interruzioni Se era un vettore). Queste sono le interruzioni nominali, non con il fuzz del confine.
  • conta n interi; per ogni cella, il numero di x [] all'interno.
  • valori di densità f^(x [i]), come valori di densità stimati. Se all (diff (breaks) == 1), sono le frequenze relative conte/n e in generale soddisfano sum [i; f^(x [i]) (b [i + 1] -b [i])] = 1, dove b [i] = interruzioni [i].
  • intensità come la densità. Obsoleto, ma mantenuto per la compatibilità .
  • media i punti medi delle cellule.
  • xname una stringa di caratteri con il nome dell'argomento x effettivo.
  • equidist logico, che indica se le distanze tra le pause sono tutte uguali.

breaks e density forniscono quasi tutto quello che serve:

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

La funzione hist ha un valore di ritorno (un oggetto della 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" 
+0

Aaaah, ha appena avuto la stessa idea e ha voluto postare questo! Sei stato più veloce :-) – TMS

+6

Devi anche notare che dovrebbe usare 'plot = FALSE', in modo che ottenga risultati senza tracciare l'istogramma. – TMS

+0

c'è un modo senza hist? Sto cercando di farcela con le interruzioni personalizzate e non funziona. Potrebbe esserci qualcos'altro? – xealits

2

Solo nel caso qualcuno colpisce questa domanda con geom_histogram in mente, si noti che esiste un modo per estrarre i dati da un oggetto ggplot.

La seguente funzione di convenienza uscita un dataframe con il limite inferiore di ciascun bin (xmin), il limite superiore di ciascun contenitore (xmax), il punto medio di ciascun bin (x), nonché il valore di frequenza ().

## 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") 

Illustrazione:

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 questione collegata ho risposto qui (Cumulative histogram with ggplot2).

Problemi correlati