2013-09-30 40 views
15

如何創建特定信息的直方圖?我有一組數據,例如:在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] 

我想基於有多少項有用於012等創建直方圖。在Ruby中有一種簡單的方法嗎?

輸出應該是以數組形式存在的倉和頻率。

+1

的輸出是什麼格式,你想? – sawa

+0

當你問一個問題,詢問代碼時,你需要展示你的研究和你爲解決問題所做的任何嘗試,以及你的解釋爲什麼他們不工作。 –

回答

8

使用此寶石 - 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 

這將創建包含直方圖的區間和包含頻率的陣列freqs陣列bins。 該寶石還支持不同的裝箱行爲和權重/分數。

希望這會有所幫助。

39

Ruby的數組繼承group_by from Enumerable,此很好的作用:

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

將返回:

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

這只是一個很好的「東經乾淨的哈希值。如果你希望每個bin和頻率對數組可以縮短其與用途:

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]] 

這裏是代碼和group_by與更小的數據集這樣做的:

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]