之前在幫長庚護理系的葉昭幸教授作一些資料分析時,曾經寫了一個 macro 以便於將 PROC FREQ 的結果拿來製造 82 個資料集。因此這個 macro 就跑了 82 次。今天我把這個程式拿來看一看,覺得有點 stupid。心想如果有更方便的方法來讓 macro 可以自動重複的把 PROC procedure 跑完的話,那就更完美了。
因此,上網路稍微搜尋一下,馬上找到答案。原始的 stupid 程式如下:
%macro variable(var,outdata);
proc freq data=symptom.msas noprint;
tables &var /out=&outdata;
run;
data &outdata;
set &outdata;
drop &var percent;
rename count=&var;
run;
%mend;
/*Distress*/
%variable(distress1, symptom.distress1);
...
...
...(省略)
%variable(distress30, symptom.distress30);
/*Severity*/
%variable(severity1, symptom.severity1);
...
...
...(省略)
%variable(severity30, symptom.severity30);
/*Freq*/
%variable(freq1, symptom.freq1);
...
...
...(省略)
%variable(freq22, symptom.freq22);
後來改成這樣:
%macro variable(var,num);
%do i = 1 %to #
proc freq data=symptom.msas noprint;
tables &var&i /out=&var&i;
run;
data &var&i;
set &var&i;
drop &var&i percent;
rename count=&var&i;
run;
%end;
%mend;
%variable(distress,30);
%variable(severity,30);
%variable(freq,22);
主要修改的地方有兩個:
一、把原本要存入symptom這個library的檔案全部改存到work裡面去,這樣這些暫存的檔案在經過下一步驟的合併之後並離開SAS後就會消失,不會佔用硬碟空間。
二、在 PROC FREQ 和 data step 外面加上一個 do loop,然後把要執行的圈數設成一個新的 macro 參數叫做 num,這樣就能拿來控制要重複執行的次數。
- Mar 16 Fri 2007 09:10
How to execute macro to run proc repeatedly
Recommend to Front page





這的確是個簡易的好方法
不過對於名字完全不同的變數
(沒有任何字尾或字首相同或連續的編號)
可能還是得寫重複的macro吧
謝謝你的分享
沒錯,但也不是完全無解!
我在「SUGI CLUB」裡面發表一篇text utility macro可以批次改變數名稱
http://sugiclub.blogspot.com/2007/03/text-utility-macros-for-manipulating.html
裡面提供幾個macro可以批次改變數名
所以可先把變數名稱一次改成有規律性的命名
等到最後再改回來
不過呢
我本文內的範例是針對具有同性質的變數所進行的計數動作並且轉置
通常這些變數命名一定會有規律性
如果沒有規律性,那表示....coding的人太沒經驗了 ="=|||
Lung-Chang
你知不知道如何用寫一個master SAS file
用來執行其他數個SAS files
這個master file中必需要有macro variable (%let....)
以便日後跑新資料使用
先謝啦!!!
Dr. Liao (以後要這樣尊稱XD)
剛好我有發表一篇文章
請到我的SUGI CLUB看下面這篇文章:
http://sugiclub.blogspot.com/2007/03/run-all-your-sas-programs-in-one.html
但我不確定你要指定%let給誰?
如果只是設定程式所在的檔案夾路徑的話
文章裡面的那個genlist就已經內建了
-----
Comment Permissions: Allow commenting