SAS學習之查詢異常值
阿新 • • 發佈:2019-01-06
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。