1. 程式人生 > >SAS學習之查詢異常值

SAS學習之查詢異常值

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。