我是想写一个用来做datacleaning的宏,清理掉input dataset中每行值都为空的变量。以下code的目的是想要得到一个宏变量&droplist,包含所有要被drop掉的变量的名字。
附上我code的关键部分:
%macro datacleaning;
/*&droplist想要包含所有需要drop掉的变量的名字,最终想要达成类似于“name visit age gender”这样的呈现结果,初始设置为空*/
%let droplist=;
proc sql;
select count(*) into: _n from varlist;
select variable into: _varlist separated by " " from varlist;
quit;
%macro a;
%do i=1 %to &_n;
%let _variable=%scan(&_varlist,&i," ");
ods trace on;
ods output OneWayFreqs=freq;
proc freq data=&dsn.;
tables &_variable;
run;
ods trace off;
proc sql;
select sum(frequency) into: sum from freq;
quit;
%if &sum eq . %then %do; /*"&sum eq ." means that in this variable all values are missing*/
%let droplist=&droplist &_variable; /*if all values of the variable are missing, add this variable name into &droplist*/
%end;
%end;
%mend;
%a;
%mend;
%datacleaning;
只要不加开头的“%macro datacleaning;”及结尾的“%mend;%datacleaning;”,我就能顺利的得到想要的&droplist,但是一旦外面再套一层宏就不行了,百思不得其解,是局部宏变量和全局宏变量的问题?还是ods output数据集的功能在宏中受限?