2015-01-07 60 views
2

相等的寬度的間隔我想創建離散變量,其將變量x成的1000的間隔我有如下:分裂變量到SAS

DATA have; 
    INPUT x; 
    DATALINES; 
1200 
3200 
5300 
49 
6500 
; 
RUN; 

我想是這樣的事

data want; 
input x y $5-14; 
DATALINES; 
1200 1000-2000 
3200 3000-4000 
5300 5000-6000 
0049 0000-1000 
6500 6000-7000 
; 
RUN; 

我當然可以寫,如果有else語句定義的間隔數據的一步,但我有這些間隔100,所以這將是非常耗時。

謝謝。

回答

6

您可以使用round()函數,舍入到最接近的1000,但首先應用500的偏移量。這會給你上限。然後減去1000以得到下限。

 
data have ; 
    input x ; 
    upper = round(x+500,1000) ; 
    lower = sum(upper,-1000) ; 
    y = catx('-',put(lower,z4.),put(upper,z4.)) ; 
datalines ; 
1200 
3200 
5300 
49 
6500 
; 
run ; 
 
    x upper lower  y 

1200  2000  1000 1000-2000 
3200  4000  3000 3000-4000 
5300  6000  5000 5000-6000 
    49  1000  0 0000-1000 
6500  7000  6000 6000-7000 

的另一種方法是定義的格式中,基於在1000個增量使用循環產生的數據集。

+0

非常感謝,它按預期工作。 –

+0

既然你知道你想要多少桶,proc排名就是這樣,但沒有格式化的輸出。 'Proc rank data = <您的數據集名稱> out = <輸出數據集> groups = 100;/*或任意數量的組想要* /' 'var growth;/*或任何你的變量* /' '隊伍增長組;/*您想要保存組號的變量* /' '跑;'' – undershock

1

我的首選方法是使用一種格式,因爲它允許您基於桶進行分析(例如PROC FREQ),但保留原始值而沒有兩個不同的變量。這基本上是Chris J的回答中最後一句的推斷。這裏的「代碼」版本:

proc format; 
    value bucket1k 
    0-<1000 = '< 1k' 
    1000-<2000 = '1k-<2k' 
    2000-<3000 = '2k-<3k' 
; 
quit; 

要爲100桶創建這種格式,你會做以下幾點:

data for_fmt; 
    retain eexcl 'Y' 
     fmtname 'bucket1k'; 
    format label $50.; 
    do start = 0 to 99000 by 1000; 
    end = start+1000; 
    label = catx(' ',start,'to',end); 
    output; 
    end; 
    if start > 99000 then do; 
    hlo='o'; 
    start=.; 
    label='MISSING'; 
    output; 
    end; 
run; 

proc format cntlin=for_fmt; 
quit; 

然後,您使用在任何需要它的分析這種格式(或應用它到數據步驟中的數據集或PROC DATASETS)。