以下几个宏连着用,可以把一个数据集的名称根据连续和分类变量映射为新的名称。可以避免变量32个字节的尴尬。处理完再映射回原变量名称即可。
%macro mvlist(inset,outset=vlist,inlib=WORK,outlib=WORK);
%nlev(&inset)
proc sql noprint;
create table tem as
select name,type
from sashelp.vcolumn
where libname=upper("&inlib") and memname=upper("&inset");
quit;
data tem1;
set nlev;
name=tablevar;
levs=nlevels;
keep name levs;
run;
%mer(tem,tem1,name,tem2)
data tem3;
set tem2;
if type eq 'char' or levs le 10 then vtype='c';
else vtype='v';
run;
%sort(tem3,vtype,name)
data &outlib..&outset;
set tem3;
by vtype;
if first.vtype then cnt=0;
if name not in ('id','target') then do;
cnt+1;
vname=cats(vtype,cnt);
end;
drop cnt;
run;
%mend;
/****************************************将数据集重新命名***************************************************/
/*先将vlist中的数据生成关键语句*/
%macro mrules(ins=vlist,fname=name,tname=vname);
data mrul;
length sen $ 1000;
sen='';
stop;
run;
data ntem;
set &ins;
if name not in ('id','target');
run;
data _null_;
if 0 then set ntem nobs=n;
call symput('obs',n);
run;
%do i=1 %to &obs;
data tem;
set ntem;
if _n_=&i;
call symput('fn',&fname);
call symput('tn',&tname);
run;
data tem1;
length sen $ 1000;
sen=catx(' ','rename',"&fn",'=',"&tn",';');
run;
proc append base=mrul data=tem1 force;
run;
%end;
%mend;
/*根据sen生成关键语句,对inset处理,生成ouset*/
%macro mgfile(inset,ouset,sen=mrul,path=e:\test.sas);
filename new "&path";
data _null_;
file new;
set &sen end=last;
if _n_=1 then put "data &ouset; set &inset;";
put sen;
if last then put 'run;';
run;
%include "&path";
%mend;