|
前面的做法效率会慢,因为DATA步要执行多次。修改了一下,DATA步只执行一次的。
data a;
input x y z t w $;
cards;
1 2 3 4 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
;
run;
options mprint;
%macro cut(ds=,cutnum=,step=);
proc contents data=&ds out=b(keep=name varnum);
run;
data _null_;
set b(drop=_all_) nobs=n;
call symputx('total',n);
stop;
run;
%let num=1;
%let cutnum1=&cutnum.;
%do %while(&cutnum1.<=&total.);
proc sql noprint;
select name into:name_list&num separated by '-'
from b
where varnum>=&cutnum1. and varnum<=&&cutnum1.+&step-1
order by varnum
;
quit;
%let cutnum1=%eval(&cutnum1.+&step.);
%put &&name_list#
%let num=%eval(&num.+1);
%end;
data a;
set a;
if _n_>1 then do;
%do c=1 %to &num.-1;
%let i=1;
%do %while(%scan(&&name_list&c,&i,-) ne %quote());
%let var=%scan(&&name_list&c,&i,-);
%let Var_order=%eval(&cutnum.+&i.-1);/*Var_order为变量在数据集中的序号*/
if &Var_order>_n_-1 then
call missing(&var);
%let i=%eval(&i+1);
%end;
%let cutnum=%eval(&Var_order+1);
%end;
end;
run;
%mend;
%cut(ds=a,cutnum=2,step=1)
|