私は...ルビーで範囲ベースヒストグラムに配列値グループに例えばヒストグラムへのRuby配列。範囲で番号をグループ化するには?
values = [ 139, 145, 149, 151, 152, 153, 163, 166, 169 ]
が必要になります。
141 - 145 = 2
146 - 150 = 1
151 - 155 = 3
...
はへの簡単な方法はありますgroup_by
を使用しますか?
私は...ルビーで範囲ベースヒストグラムに配列値グループに例えばヒストグラムへのRuby配列。範囲で番号をグループ化するには?
values = [ 139, 145, 149, 151, 152, 153, 163, 166, 169 ]
が必要になります。
141 - 145 = 2
146 - 150 = 1
151 - 155 = 3
...
はへの簡単な方法はありますgroup_by
を使用しますか?
範囲。これらの値を決定するには、データの一部の前処理が必要な場合があります。たとえば、次のように我々は最初のグループの最小値とグループの数を計算するかもしれない
values = [139, 145, 149, 151, 152, 153, 164, 166, 169]
group_size = 5
を与えられた:
smallest, largest = values.minmax
#=> [139, 169]
start = group_size*(smallest/group_size)
#=> 135
nbr_groups = ((largest-start+1)/group_size.to_f).ceil
#=> 7
現在、我々は、ヒストグラムを作成するために使用することができ、アレイを構築することができます。
def group_values(values, start, nbr_groups, group_size)
groups = Array.new(nbr_groups) do |i|
f = start + i * group_size
{ nbr: 0, range: f..f+group_size-1 }
end
values.each_with_object(groups) { |v,arr|
arr[(v-start)/group_size][:nbr] += 1 }
end
のは、(start
と上記計算nbr_groups
の値のために)それを試してみましょう。
freq = group_values(values, start, nbr_groups, group_size)
#=> group_values(values, 135, 7, 5)
#=> [{:nbr=>1, :range=>135..139},
# {:nbr=>0, :range=>140..144},
# {:nbr=>2, :range=>145..149},
# {:nbr=>3, :range=>150..154},
# {:nbr=>0, :range=>155..159},
# {:nbr=>1, :range=>160..164},
# {:nbr=>2, :range=>165..169}]
得られた配列の各要素のため:range
の
values
(値は140-144
と155-159
)の要素を含まないグループが返される配列に含まれるように、配列groups
を初期化しました。私がそのアレイをその場で構築したのであれば、その2つのグループのハッシュは含まれていなかったでしょう。freq.map { |h| h[:nbr] }.minmax
#=> [0, 3]
あなたは、各範囲のための簡単な定義を扱っているので、[はい]:通常
values.group_by do |v|
(v-1)/5
end.values
# => [[139], [145, 149], [151, 152, 153], [163], [166, 169]]
group_by
も、グループ要素を含んでいるが、この場合には、それは便利ではありませんので、これは無視することができます。
あなたはこの使用範囲で探しているのフォームにこれを変換することができます:ヒストグラム1は、通常、最初の範囲の最小値、範囲の大きさや数を指定し準備するに
values.group_by do |v|
(v-1)/5
end.map do |v, a|
[ (v*5+1..v*5+5), a.length ]
end.to_h
# => {136..140=>1, 141..145=>1, 146..150=>1, 151..155=>3, 161..165=>1, 166..170=>2}