1.查找缺失值的万能程序
data missing;
set sasuser.xb;
array cha[*] _character_ \*利用*好不指定cha数组中的字符型变量个数*\
do i=1 to dim(cha); \*指定循环次数为数组cha中的元素数*\
if missing(cha[i]) then output;
end;
array num[*] _numeric_;\*利用*号不指定num数中的数值型变量个数*\
do i=1 to dim(num); \*指定循环次数为数组num中的元素数*\
if missing(num[i]) then output;
end;
proc print;
run;
cha[*]和num[*]的意思是建立数组cha和num,但不指定数组中的元素数,具体有多少个由SAS根据变量来自己判断。
dim()函数是专门针对数组的函数,它的作用是返回指定数组所含的元素个数。如指定数组array x[*]a b c,则dim(x)返回值为3.
2.查找异常值
基本格式为:
data 新数据集;
set 已有数据集;
if|where 条件语句;
proc print;
run;
这几句语句的意思是建立一个新数据集,然后利用set语句把所有的数据集复制进来,但并非全部复制,而是根据if或where语句指定的条件,仅复制符合条件(如缺失或异常等)的记录。
**if和where的区别
1)if和where都可以使用的场合
在利用set语句有条件地复制数据集时,set后紧跟着条件语句,此时用if和where都可以。但where的运行速度要快一点。
2)只能用if的几种场合
使用SAS的自动变量时;如果指定的条件变量是新产生的变量,只能用if,不能用where。
3)只能用where的几种场合
当使用某些特殊运算符时(between…and,contains);当调用某一proc过程时,如果要选择部分观测执行该过程,只能用where语句,不能用if语句。
还有当做数据集选项使用时,只能用where,不能用if。
3.查找异常值的万能程序
%let data=sasuser.xb;
%let id=id;
%macro outline(var=,low=,high=);
data outline;
set &data.(keep=&id. &var.);
length variable $20. reason $20.;
variable="&var.";
value=&var.;
if &var.<&low. and not missing(&var.) then do;
reason="过低";
output;
end;
else if &var.>&high. and not missing (&var.) then do;
reason="过高";
output;
end;
drop &var.;
proc append base=outliner1 data=outline;
run;
%mend outline;
%outline(var=height,low=150,high=200);
%outline(var=weight,low=40,high=100);
%outline(var=y1,low=1,high=5);
%outline(var=y2,low=1,high=5);
%outline(var=y3,low=1,high=5);
%outline(var=y4,low=1,high=5);
%outline(var=y5,low=1,high=5);
proc print data=outliner1;
run;
需要修改的地方:第一行的数据集;第二行的id变量;最后几行的7个outline。