Domanda

Ho un po 'di numeri che voglio usare per generare un istogramma per un punteggio standard.

Quindi calcola la media e la deviazione standard dei numeri e normalizzare ogni x con questa formula

x'= (x-media) / std_dev

Il risultato è un numero compreso tra -4 e 4 voglio tracciare quel risultato. Sto cercando un modo per raggruppare i numeri al fine di evitare di piccoli bar.

Il mio piano è quello di avere bidoni nell'intervallo [-4,4] centrata a unità trimestre consecutavice, cioè [-4, -3.75, ..., 3.75,4]

Esempio: 0,1 => bin "0,0", 0,3 => bin "0,25", -1.3 => Bin "-1.5"

Qual è il modo migliore per raggiungere questo?

È stato utile?

Soluzione

Ecco una soluzione che non utilizza alcuna terza librerie di parti. I numeri dovrebbero essere nella vals Array.

MULTIPLIER  = 0.25 
multipliers = []
0.step(1, MULTIPLIER) { |n| multipliers << n }

histogram = Hash.new 0

# find the appropriate "bin" and create the histogram
vals.each do |val|
  # create an array with all the residuals and select the smallest
  cmp = multipliers.map { |group| [group, (group - val%1).abs] }
  bin = cmp.min { |a, b| a.last <=> b.last }.first
  histogram[val.truncate + bin] += 1
end

Credo che esegue la corretta arrotondamenti. Ma ho provato solo con:

vals = Array.new(10000) { (rand * 10) % 4 * (rand(2) == 0 ? 1 : -1) }

e la distribuzione ottenuto sorta di distorta, ma che probabilmente è colpa del generatore di numeri casuali.

Altri suggerimenti

Rails fornisce Enumerable # group_by - vedere il fonte qui, supponendo che non si sta usando Rails: http://api.rubyonrails.org/classes/Enumerable.html

Supponendo che la vostra lista si chiama xs, si potrebbe fare qualcosa di simile a quanto segue (non testato):

bars = xs.group_by {|x| #determine bin here}

Poi avrete un hash che assomiglia a:

bars = { 0 => [elements,in,first,bin], 1 => [elements,in,second,bin], etc }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top