2018年1月27日

〔SAS〕列聯表捕無數值的欄(列)

有沒有遇過在製作表格式時,某變項中的類別不見,但在製表時必須將消失的類別補上的狀況呢?不懂嗎?看看下面的表格吧,臺中市的結果沒出現在這份資料中,但最終表格還是必須把臺中市放上去,就算所有的結果都是遺漏值或零。

但SAS的PROC FREQ如果資料中沒有這項類別的資料,自然不會呈現於報表中!所以這次的分享,就是如何「強迫」PROC FREQ列出不存在但又想呈現的類別。

先建立一份模擬的資料檔,程式如下:

data test1;
     do i=1 to 1000;
         do city=1 to 6;
             do year=101 to 105;
                 if uniform(578) >=0.1 then output;
             end;
         end;
     end;
run;
proc format;
     value city_f 1="新北市" 2="臺北市" 3="桃園市" 4="臺中市" 5="臺南市" 6="高雄市";
run;

data test2;
     set test1;
     if city=4 then delete;
run;

proc freq data=test2 ;
     format city city_f.;
     tables city*year /norow nocol nopercent format=comma6.;
run;

程式簡易說明:
test1為建立一個樣本數為30,000以內的資料檔(隨機刪除約10%的個案),資料裡面包含了city和year。
test2依據test1所建立的資料,將city=4的結果全部刪除,模擬沒有「臺中市」的資料。

PROC FREQ結果如下:

因為city數值為4(臺中市)的結果被刪除,在結果表中也不會出現臺中市的結果,接下來說明如何將臺中市的結果補上。步驟如下:

1.建立變項組合的資料架構檔(form1),也就是產生city 和 year所有的組合架構。

data form1;
     do city=1 to 5;
         do year=101 to 105;
             output;
         end;
     end;
run;

2.分析資料檔(test2)與架構資料檔(form1)合併,並將來自分析資料檔的資料設定weight為1,來自架構資料檔的資料設定weight為0。

data test3;
     set test2 (in=a) form1(in=b);
     if a=1 then weight=1;
     if b=1 then weight=0;
run;

3.以PROC FREQ分析,並使用WEIGHT及ZEROS語法。

proc freq data=test3 ;
    format city city_f.;
     tables city*year /norow nocol nopercent format=comma6. ;
     WEIGHT weight /ZEROS;
run;

最後提供year變項中的103類別刪除後的結果

希望這次內容能夠幫助大家製作表格的速度。祝大家製表愉快嘍~

沒有留言:

張貼留言