2017-06-13 61 views
-1

我有大約2330000個觀察值,我想分配均勻間隔的10,000個桶。桶標準將最大(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 
.... 

應該如何編寫代碼?我正在考慮做一個循環,但不知道如何做到這一點?誰能幫忙?

+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; 

解決方案

/*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;