楼主: andy162639
9025 22

[原创博文] sas变量批量删除 [推广有奖]

21
meishanjia1900 发表于 2011-11-8 20:38:01
是我笨了,看出来了

这里%let i=1之后的那个%do-%end可以修改简化。

我差点就看不懂了。这里应该写清晰些。

22
HaricH 发表于 2011-11-9 10:03:30
前面的做法效率会慢,因为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&num;
                %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)

23
HaricH 发表于 2011-11-9 10:04:58
不过还有一种更好得方法,就是将字典表抓入PDV。代码也少很多。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-20 09:38