学sas中,写了个判断字符型变量的缺失值是否大于给定阀值的宏,分享一下。
data text1;
input x1 $ x2 $ y $;
cards;
. 2 a
. 3 b
6 7 .
3 4 c
9 8 e
. 24 .
8 . g
. 33 .
22 77 t
. 19 b
20 . u
21 16 o
;
run;
proc contents data=work.text1 out=tt;
run;
%macro varmiss(rate);
%if %sysfunc(exist(work.miss)) ne 0 %then %do;
proc datasets lib=work;
delete miss;
quit;
data miss;
length var $10 percent flag 5;
stop;
run;
%end;
%let disd=%sysfunc(open(work.tt));
%if &disd gt 0 %then %do;
%let nobs=%sysfunc(attrn(&disd,nobs));
%do i =1 %to &nobs;
%let rc=%sysfunc(fetchobs(&disd,&i));
%let varnume=%sysfunc(varnum(&disd,name));
%let variable=%sysfunc(getvarc(&disd,&varnume));
ods listing close;
ods output OneWayFreqs=cc&i.;
proc freq data=text1 ;
tables &variable. /missing;
run;
ods output close;
ods listing;
data freq&i.(keep=&variable. percent flag rename=(&variable.=var));
set cc&i.;
if &variable eq "" then do ;
&variable.="&variable.";
if percent gt &rate. then flag=1;else flag=0;
output;
end;
run;
proc append base=miss data=freq&i. force;
run;
%end;
%let disd=%sysfunc(close(&disd));
%end;
%mend;
%varmiss(30);