|
可以设置个步长。
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;
%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;
%do %while(&cutnum.<=&total.);
proc sql noprint;
select name into:name_list separated by '-'
from b
where varnum>=&cutnum. and varnum<=&&cutnum.+&step-1
order by varnum
;
quit;
%put &name_list.;
data a;
set a;
%let i=1;
%do %while(%scan(&name_list,&i,-) ne %quote());
%let var=%scan(&name_list,&i,-);
%let Var_order=%eval(&cutnum.+&i.-1);/*Var_order为变量在数据集中的序号*/
if _n_>1 then do;
if &Var_order>_n_-1 then
call missing(&var);
end;
%let i=%eval(&i+1);
%end;
run;
%let cutnum=%eval(&cutnum.+&step.);
%end;
%mend;
%cut(ds=a,cutnum=2,step=1)
|