[SAS] macro 反覆運算%DO part2

在切入%DO主題之前

[SAS] macro 反覆運算%DO part1文章內提過關於%DO的基本寫法以及如何寫簡單的迴圈

掌握的幾個關鍵:起始值、結束值、%DO目標變數前不給&記號…等

除了單獨寫一組迴圈之外,還可以在SAS Data step或PROC step的statement內建立迴圈

這也是本文記錄的重點,範例是參考書中Ch7的例子。

進入程式之前,先提到這次要處理的問題背景

同上次的例子,使用者手上有三個檔案sales.year2005,sales.year2006,sales.year2007,

分別代表2005~2007的業務資料,現在想要將這三個檔案set在一起成為名稱為manyyears的檔案,

然後使用GCHART procedure作圖並且給標題「Charts Analyze Data for: 2005 2006 2007」

因此從問題中可以得知可能需要用到迴圈的地方是「將檔案set在一起」,「標題裡面的年份串在一起」這兩部分

那在set statement裡面怎麼嵌入一組迴圈呢?

以下是名為sumyears的macro程式

%macro sumyears(startyear,stopyear);/*起始值與結束值的參數*/
     data manyyears;/*我要得到一個總檔案為manyyears*/
         set /*開始進行set statement*/
         %do yearvalue=&startyear %to &stopyear;/*迴圈起始值與結束值的參數引用*/
                  sales.year&yearvalue /*丟入會用到的年份檔案,注意後面沒有分號*/
        %end;/*老樣子一個DO給一個END包起來*/
        ;
    run;/*接下來要處理把年份串在一起放在標題內的問題*/

    %let yearstring=;/*新作一個macro變項以便放入串在一起的年份值*/
     %do yearvalue=&startyear %to &stopyear;
     %let yearstring=&yearstring &yearvalue;/*為了讓年份串在一起作的技巧,每次跑就會往後加*/
     %end;

    proc gchart data=manyyears;/*進入GCHART畫圖的部分*/
         title “Charts Analyze Data for: &yearstring“;/*引用串年份的macro變項yearstring*/
         hbar section;
    run;
    quit;
%mend sumyears;

最後打這麼辛苦,呼叫macro程式sumyears↓

%sumyears(2005,2007)

上面程式就全部完成,呼叫的兩個參數丟入2005,2007就可以讓她自己去跑

在macro processor解讀呼叫的時候,程式就變成….

    data manyyears;
         set sales.year2005 sales.year2006 sales.year2007;
    run;
    proc gchart data=manyyears;
         title “Charts Analyze Data for: 2005 2006 2007“;
         hbar section;
    run;
    quit;

這邊比較需要留意的是在set statement的迴圈那邊

如果說你在下面程式的第二行後面加上分號,這個分號就會在第一次run的時候截斷這個set statement最後導致error

%do yearvalue=&startyear %to &stopyear;
      sales.year&yearvalue        
%end;

以上就是在macro內使用%DO迴圈作反覆運算

歡迎各位讀者建議補充

參考資料:SAS Macro Programming Made Easy, Second Edition

Share


留言回覆

CAPTCHA 驗證圖片 CAPTCHA Audio
更換一張圖片

Since 2010 total of 463303 visits