2017-06-13 1 views
-1

私は約2330000回の観測を行い、均等に間隔を置いた10,000個のバケットを割り当てたいと思います。バケット基準はmax(var) - min(var)/ 10,000です。たとえば、私の最大値は3000、最小値は-200ですから、バケットサイズは(3000 + 200)/10,000=0.32になります。したがって、-200〜(-200 + 0.32)の間の任意の値はバケット1に、(-200 + 0.32)〜(-200 + 0.32 * 2)の間の値はバケット2に移動する必要があります。データセットは次のようになります。ループを実行してバケットを割り当てます

Var_value   bucket 
-200     1 
-53      ? 
-5      ? 
-46      ? 
5 
8 
4 
56 
7542 
242 
.... 

コードはどのように記述する必要がありますか?私はdoループを考えていますが、それをどうやって行うのかはわかりません。誰も助けることができますか?

+1

何を試しましたか?これは無料のコーディングサイトではありません。 ほとんどすべての言語のループがネット上にあります。 [ここで質問する方法のこの記事を見てください](http://www.wikihow.com/Ask-a-Question-on-Stack-Overflow)、私はあなたを落胆させたり、失礼にしたくないのですが、これはルールに従うべきです。 –

答えて

1

ないあなたが提案したループとどうなるのか確認してくださいが、これは私がしたいものです。

以下
/* get some data to play with */ 
data a(keep=val); 
do i=1 to 1000000; 
    val = 3200*ranuni(0)-200; 
    output; 
end; 
run; 
/* groups=xxx specifies the number of buckets 
    var yyy is the name of the variable whose values we'd like to classify 
    ranks zzz specifies the name of the variable containing the assigned rank 
*/ 
proc rank data=a out=b groups=10000; 
var val; 
ranks bucket; 
run; 
+0

これはパーセンタイルベースで動作するため、これが必ず正確に10000バケットを与えるかどうかわかりません。たくさんの関係がある場合は、明確な境界がないかもしれません。 – Reeza

+0

ありがとうございます! –

0

は、あなたが使用できる別のアプローチである:

はランダムシミュレーションデータ

を生成します
data have; 
    do i=1 to 250000; 
     /*Seed is `_N_` so we'll see the same random item count.*/ 
     var_value = (ranuni(_N_)-0.5)*8000; 
     output; 
    end; 
    drop i; 
run; 

ソリューション(S)

/*Desired number of buckets.*/ 
    %let num_buckets = 10000; 

/*Determine bucket size and minimum var_value*/ 
    proc sql noprint; 
     select (max(var_value)-min(var_value))/&num_buckets., 
       min(var_value) 
     into : bucket_size, 
      : min_var_value 
     from have; 
    quit; 
    %put bucketsize: &bucket_size.; 
    %put min var_value: &min_var_value.; 

/* 1 - Assign buckets using data step */ 
    data want; 
     set have; 
     bucket = max(ceil((var_value-&min_var_value.)/&bucket_size.),1); 
    run; 
    proc sort data=want; 
     by bucket; 
    run; 

/* or 2 - Assign buckets using proc sql*/ 
    proc sql; 
     create table want as 
     select var_value, 
       max(ceil((var_value-&min_var_value.)/&bucket_size.),1) as bucket 
     from have 
     order by CALCULATED bucket; 
    quit; 
関連する問題