在資料整理或分析的過程中,有時候需要反覆執行某一段程序
每次執行的程序可能只有欄位不同或檔案不同,其餘大部分的程式是一樣的
最簡單也是最笨的方法就是一直Ctrl+C and Ctrl+V,然後再修改每段程序裡的欄位名稱或檔案名稱
但很沒效率,程式也變得像阿媽的裏腳布那樣又臭又長,很不美觀
此時,SAS的巨集函數(macro)就會是我們的最好朋友
macro能用較簡短的程式來完成相同的工作,不僅讓整個程式看起來更簡潔,也提升工作效率
其基本架構是以「%macro」開頭,中間包覆著一段要重複執行的程序,最後以「%mend」結束,如:
    %macro name(variable1, variable2);
        /*重複執行的程序*/
    %mend;
其中,name是宣告此段巨集函數的名稱
variable1, variable2是一直要被取代的巨集變數,會在被包覆的程序裡,加上「&」符號來宣告
到這邊是在宣告希望macro幫我們執行哪些反覆的程序,但實際要執行時需再呼叫此macro出來,即:
    %name(variable1, variable2);

以分析健保資料庫為例
若要計算1996年住院檔中每人最早的糖尿病入院日期及糖尿病總住院次數,但排除案件分類為AZ, DZ的資料
程式會是:

若1997-2001年住院檔也要做同樣的事情時,依照傳統的方法就是複製這段程式5次
然後把dm1996依序改成dm1997, dm1998 至 dm2001
也把dd1996依序改成dd1997, dd1998 至 dd2001,如下:

這程式還真是落落長啊!!且要一個一個修改檔名,對我這種比較懶的人來說覺得很麻煩
若改成macro的寫法,整個是輕鬆、愜意~~~

%macro後的dm是此段巨集函數的名稱,year是要一直被替換的巨集變數
%macro和%mend之間是要反覆執行的程序,其中的「&year」是會一直被替換的巨集變數
接著的%dm(1996); 到%dm(2001);是執行此段巨集函數,並依序從1996到2001取代「&year」
這樣短短幾行程式就解決我們的問題了

就這個問題,是否還有更簡短的寫法呢??有的
若巨集變數是一串連續數字,或有規則的一串數字,可以更進階的以do loop來簡化程式,架構為:
    %macro name;
       
%do variable=起始值 %to 結束值 %by 間距;
           
/*重複執行的程序*/
        %end;
   
%mend;
宣告完巨集函數後,同樣需再呼叫它出來,即:%name;
因此,原本的macro可再改寫為

 

延申閱讀:

【SAS】使用ODS整理分析結果
【SAS】資料歸戶
【SAS】在macro中自動累加檔案
【SAS】將檔案內容設為巨集變數

arrow
arrow

    rover1023 發表在 痞客邦 留言(0) 人氣()