大家在工作学习中或许会遇到批量处理表或某一类变量的操作。这用到了创建宏的一些方法,Data步和SQL步有都提供了一下创建和修改宏变量的方法或例程,以下只是一个简单的示例,用于批量处理一个表中的一类变量,在每个都作描述性统计的同时,用盖帽法处理异常值(上下1%被认为是极端值)。
需要说明的如下:
&SQLOBS是每次执行SQL过程自动生成的宏变量,存放了返回的行数;
into :name1-:name&Rows用于在SQL步中创建连续宏变量数组,用于后面的宏循环体内;
sashelp.vcolumn是SAS维护的数据字典的视图,里面存放了所有表的信息;
以下是完整的程序示例:
/*本程序在work逻辑库下生成一张同名的剔除原表中所有的数值型连续变量的极端值*/
%let lib=sashelp;/*输入逻辑库*/
%let table=CITIQTR;/*输入表名*/
/**/
data &table;
set &lib..&table;
run;
%macro vr(v);
proc means data=&table n nmiss mean median mode min p1 p99 max std skewness ;
var &v.;
output out=var p1=p1 p99=p99;
run;
data _null_;
set var end=last;
call symputx('min',p1);
call symputx('max',p99);
run;
data &table;
set &table;
if &v.>=&max. then &v.=&max.;
if &v.<=&min. then &v.=&min.;
run;
%mend vr;
proc sql;
select name from sashelp.vcolumn
where libname="&lib" and type='num' and memname="&table";
%let Rows=&SQLOBS;
select name
into :name1-:name&Rows
from sashelp.vcolumn
where libname="&lib" and type='num' and memname="&table";
quit;
%Macro WINSORIZE;
%do i=1 %to &Rows;
%vr(&&name&i);
%end;
%mend WINSORIZE;
%WINSORIZE