[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
