配列の配列の2番目の要素の平均値の計算方法。代わりにそれらを追加する:Ruby:日付によるグループ化中の配列の配列の平均値の計算
[ [ '01-01-2001', 4 ], [ '01-01-2001', 5 ], [ '01-01-2001', 6 ], [ '01-02-2001', 7] ]
[ ['01-01-2001', 5], [ '01-02-2001', 7] ]
か?
配列の配列の2番目の要素の平均値の計算方法。代わりにそれらを追加する:Ruby:日付によるグループ化中の配列の配列の平均値の計算
[ [ '01-01-2001', 4 ], [ '01-01-2001', 5 ], [ '01-01-2001', 6 ], [ '01-02-2001', 7] ]
[ ['01-01-2001', 5], [ '01-02-2001', 7] ]
か?
これを行うには2つの方法があります。
arr = [[ '01-01-2001', 4 ], [ '01-01-2001', 5 ], [ '01-01-2001', 6 ], [ '01-02-2001', 7]]
arr.group_by(&:first).transform_values { |v| v.sum(&:last).fdiv(v.size) }
#=> {"01-01-2001"=>5.0, "01-02-2001"=>7.0}
Hash#transform_values、Array#sumとNumeric#fdivを参照してください。この方法は、の値を決定するためにブロックを使用Hash#update
(別名merge!
)の形式を使用し
arr.group_by(&:first)
#=> {"01-01-2001"=>[["01-01-2001", 4], ["01-01-2001", 5], ["01-01-2001", 6]],
# "01-02-2001"=>[["01-02-2001", 7]]}
:
最初のステップは、グループに日付要素であります両方のハッシュに存在するキーがマージされます。
arr.each_with_object({}) do |(k,v), h|
h.update(k=>[v, 1]) { |_k, (otot, onbr), (ntot, nnbr)| [otot+ntot, onbr+1] }
end.transform_values { |tot, nbr| tot.fdiv(nbr) }
がマージされ、両方のハッシュに含まれる各キーの値を返すブロックに使用される三つのブロック変数を説明するためのドキュメントを参照してください。ハッシュh
は、別個の日付ストリングごとに、第1の値が所与の日付の合計値であり、第2の値がその日付のオカレンスである2要素配列を含む。もちろん、すべての値の積算値を維持することは、group_by
メソッドのように、すべての値の配列を維持するよりも、スペース効率が向上します。
Rubyではをh.update({ k=>[v, 1] })
の略語として許可しています。