2013-09-30 7 views
15

Come si crea un istogramma di informazioni specifiche? Ho una serie di dati, ad esempio:Creazione di un istogramma in Ruby

data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10] 

Voglio creare un istogramma in base a quante voci ci sono per 0, 1, 2, e così via. C'è un modo semplice per farlo in Ruby?

L'uscita deve essere in bidoni e frequenze sotto forma di array.

+1

Qual è il formato di output volere? – sawa

+0

Quando fai una domanda, chiedi il codice, devi mostrare la tua ricerca e ogni tentativo che hai fatto per risolvere il problema, insieme alla tua spiegazione del perché non hanno funzionato. –

risposta

8

Utilizzare questo gioiello - http://rubygems.org/gems/histogram

data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10] 
(bins, freqs) = data.histogram 

Ciò creerà un array bins contenente i cassonetti di istogramma e matrice freqs contenente le frequenze. La gemma supporta anche diversi comportamenti di binning e pesi/frazioni.

Spero che questo aiuti.

39

Array di Ruby eredita group_by from Enumerable, che fa questo bene:

Hash[*data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] }] 

che restituisce:

{ 
    0 => 1, 
    1 => 1, 
    2 => 5, 
    3 => 6, 
    4 => 4, 
    5 => 2, 
    6 => 3, 
    7 => 5, 
    8 => 1, 
    9 => 2, 
    10 => 1 
} 

Questo è solo un bel 'n pulita hash. Se si desidera una matrice di ogni coppia bin e la frequenza si può accorciare ed impiego:

data = [0,1,2,2,3,3,3,4] 
data.group_by{ |v| v }.map{ |k, v| [k, v.size] } 
# => [[0, 1], [1, 1], [2, 2], [3, 3], [4, 1]] 

Ecco ciò che il codice e group_by sta facendo con il set di dati più piccolo:

data.group_by{ |v| v }  
# => {0=>[0], 1=>[1], 2=>[2, 2], 3=>[3, 3, 3], 4=>[4]} 

data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] } 
# => [0, 1, 1, 1, 2, 2, 3, 3, 4, 1]