根据贴15的宏可以挑出适合用作分类变量的变量,以下则利用前步生成的set_des数据集以及分类指示变量cls_indi来提取出
所有对应的变量水平,存放在var_class数据集中。(为了避免后续变量大小写的问题,全部把变量名称转化为小写)
生成的临时数据集全部以_templ 开头,如果这个过程可能会生成大量的临时数据集可以及时清空。
/*析取变量的水平值
输入数据集为 ins1
默认经过了set_des处理,用cls_indi指示分类变量
*/
%macro vlevel(ins1,ins=set_des,indi=cls_indi);
/*不能使用noprint,否则sql自动宏变量有问题*/
proc sql;
select name
from &ins
where &indi;
quit;
/*2对自动宏变量进行二次赋值*/
%letrows=&sqlobs;
/*3用sql给每一个变量名称映射到宏变量中*/
proc sql noprint;
select name into :var1-:var&rows
from &ins
where &indi;
quit;
/*4进行do循环取出各水平,拼成数据集*/
%do i=1 %to &rows;
proc sortdata=&ins1(keep=&&var&i) out=lname nodupkey;
by &&var&i;
run;
data %sysfunc(cats(_templ,&i));
length level $ 15;
set lname;
varname=lowcase(symget('var'||left(&i)));
level=left(&&var&i)||'';
drop &&var&i;
run;
%end;
/*5把所有变量及其水平拼接到一个数据集中*/
data var_class;
set _templ1-_templ&rows;
run;
%mend;