1

ユーザーをグループ化して、次のようなルビー ハッシュのデータから散布図を作成しようとしています。

[{"userid"=>"1275", "num"=>"1", "amount"=>"15.00"}, 
 {"userid"=>"1286", "num"=>"3", "amount"=>"26.67"}, .... ] 

基本的に、num の値は 1 から 4 までの整数で、amount は最大 100 までです。最初に num でグループ化してから、4 つの新しいビンのそれぞれを合計 16 のグループの量 (0-20、20-50、50-80、80+) でさらに分割する必要があります。

最終製品は、ハッシュの配列、または配列の配列である必要があります。これをビューに渡して、d3 にプロットすることができます。私は機能的なバージョンを持っており、case ステートメントと基本的なフロー制御条件を使用してそれを行いましたが、よりエレガントで短いコードを作成するために group_by 句を使用してこれを行いたいと考えています。

group_by のドキュメントがよくわからないので、助けていただければ幸いです。

編集:出力は多かれ少なかれこのようなものになるはずです

[[{"userid"=>"1", "num"=>"1", "amount"=>"15.00"}
  {"userid"=>"2", "num"=>"1", "amount"=>"19.00"}],
 [{"userid"=>"3", "num"=>"1", "amount"=>"25.00"}
  {"userid"=>"4", "num"=>"1", "amount"=>"30.00"}],
 [{"userid"=>"5", "num"=>"2", "amount"=>"15.00"}]]

基本的に、キーと値のペアの 16 個のサブ配列を含む配列です。

4

3 に答える 3

0

もしかしてこんな?

配列 group_by 関数を使用していますが、それをビニングして量を考慮し、それを group_by 条件に入れます

arr = [{"userid"=>"1", "num"=>"1", "amount"=>"15.00"},{"userid"=>"2", "num"=>"1", "amount"=>"19.00"},{"userid"=>"3", "num"=>"1", "amount"=>"25.00"},{"userid"=>"4", "num"=>"1", "amount"=>"30.00"},{"userid"=>"5", "num"=>"2", "amount"=>"15.00"}]

a2 = arr.group_by {|i| ((i['num'].to_i-1) + 4 * bin(i['amount'])) }.values

def bin val
    iVal = val.to_i
    if iVal<=20 then return 0 end
    if iVal<=50 then return 1 end
    if iVal<=80 then return 2 end
    return 3
end

結果はまさにあなたが望んでいた通りです

[[{"amount"=>"15.00", "num"=>"1", "userid"=>"1"}, {"amount"=>"19.00", "num"=>"1", "userid"=>"2"}], [{"amount"=>"15.00", "num"=>"2", "userid"=>"5"}], [{"amount"=>"25.00", "num"=>"1", "userid"=>"3"}, {"amount"=>"30.00", "num"=>"1", "userid"=>"4"}]]

私は実際に 2 つのパラメーターを 1 つの次元パラメーター (ハッシュ関数) にマッピングしているので、関数は実際には

<max value of num>*<bin according to amount>+<num-1>

num の最大値が 4 の場合、ビン 0 は 0..3 にマップされ、ビン 1 は 4..7 にマップされ、ビン 2 は 8..11 にマップされ、ビン 3 は 12..15 にマップされます。重要なオーバーラップはありません。

于 2013-07-25T18:34:11.793 に答える