2009-05-18 13 views
2

、それは注入して十分に簡単ですセット0 25 53と80Rubyで配列の平均値を設定するにはどうすればよいですか?次のような単純なデータセットを考えると

[["0", "148.5"], 
    ["0", "146.5"], 
    ["0", "148.6"], 
    ["0", "202.3"], 
    ["25", "145.7"], 
    ["25", "145.5"], 
    ["25", "147.4"], 
    ["25", "147.3"], 
    ["53", "150.4"], 
    ["53", "147.6"], 
    ["53", "147.8"], 
    ["53", "215.4"], 
    ["80", "150.4"], 
    ["80", "149.4"], 
    ["80", "148.0"], 
    ["80", "149.9"]] 
+0

あなたは言い換えることができますか?あなたが何を求めているのか分かりません。答えの例が参考になります。 –

+0

ジェイソンのコードは、私が探しているものを返す: {"80" => 149.425、 "25" => 146.475、 "0" => 161.475、 "53" => 165.3} –

答えて

6

の値を平均化するための最良の方法は何ですか。私はしばしば、このようなものを手助けするプロジェクトで一般的なgroup_byメソッドを実装します。

データが大きく、パフォーマンスの問題がある場合は、数値ライブラリまたはデータベースを使用することを検討してください。

data = [ ... ] 

groups = data.inject({}) do |hash, pair| 
    hash[pair.first] ||= [] 
    hash[pair.first] << pair.last.to_f 
    hash 
end 

groups.inject({}) do |hash, pair| 
    hash[pair.first] = pair.last.inject(0,&:+)/pair.last.size 
    hash 
end 
+0

brilliant!あなたは説明することができますか、&:+のいくつかのドキュメントを指し示すことができますか?私は注射が初期値とブロックに加えて引数を取ったことを知らなかったし、それはブロックだ!うーん、私はあなたが私の心を吹き飛ばしたと思う! –

+0

これはブロックです:http://blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand '&:foo'は':foo.to_proc'の構文砂糖です。 'Symbol#to_proc'は、' Proc'オブジェクトで送信されるメソッドをラップするために便宜的に書き込まれます。 これはすばらしいことですが、長さに比べてパフォーマンスオーバーヘッドがあることに注意してください。パフォーマンスの重要な内部ループには使用しないでください。 –

+0

Dohは、マークダウンの乱雑を謝罪し、コメントが回答と同じようにフィルタされていないことを認識していませんでした。 –

1

ハッシュで注射を使用するとパフォーマンスが低下します(各繰り返しでメモの変数を再割り当てしています)。

result = array.map{ |row| [row.first.to_i, row.last.to_f] }.group_by(&:first) 
result.each_pair do |key, values| 
    result[key] = values.average 
end 

Array#average簡単

class Array 
    def average 
    inject(0.0) { |sum, e| sum + e }/length 
    end 
end 

あなたのデータ、その事実として実装されている:あなたは1.9にしている場合は、列挙は、もう少しコード明白を作るために使用することができる方法group_byは、実装します文字列は非常に不便です、私は可能な限り避けることをお勧めします。

+0

「各繰り返しでメモの変数を再割り当てする」という意味を説明できますか?呼び出しは参照によって行われるため、変数の代入には値の型に関係なく同じオーバーヘッドが含まれます。 –

関連する問題