我有一個宏在給定數據集中查找變量名稱。如果宏查找的變量名稱丟失,丟失的變量名被添加到一個表:proq sql宏;遍歷列表
%macro miss(ds, var);
%local rc dsid result;
%let dsid=%sysfunc(open(&ds));
%if %sysfunc(varnum(&dsid,&var)) > 0 %then %do;
%put &var present;
%end;
%else %do;
insert into work.compare(missing) values("&var")
%end;
%mend;
proc datasets library=work nolist nodetails;
delete compare;
run;
proc sql;
create table work.compare (missing char(15));
%miss(ctr.panup_in, u_name);
quit;
proc print noobs data=work.compare;
run;
這種檢查需要55不同的變量名來運行。目前,我只列出每一個作爲一個
%miss(ctr.panup_in, varname);
線。
出於實際的原因,我想指定變量列表作爲列表,例如%let dictionary = var1 var2 var3等。我現在正在努力尋找一種方法讓宏在循環變量列表中循環。到目前爲止,我所嘗試的所有內容都會導致「Stament is not valid」錯誤,其中包含
insert into work.compare(missing) values("&var")
命令。
有沒有人有任何建議如何做到這一點?
如果你知道你有55個變量,爲什麼不在宏內使用datastep而不是sql,並且do循環和掃描函數添加每個變量? – kl78
我會推薦一個數據步驟,然後調用execute來代替。以下是如何通過宏變量循環https://gist.github.com/statgeek/9603186 – Reeza
@ 20salmon如果您仔細查看我的代碼示例,您將找到一個比較宏,比較兩個數據集之間的變量。 – Reeza