標籤:des style class blog code http
指派陳述式
variable=expression
幾種賦值的執行個體:
x = x1+x2;
x = sum(of x1-x6); 括弧中要用of
sum(x,y);如果x或y中有一個為缺失值,sum的結果會將缺失值設為0,而如果用z=x+y;有缺失值的話z的結果會為缺失值
ar(1) = br(1); *將數組br的第一個元素賦值給數組ar的第一個元素,sas中數組的下標以1開始;
x = x+y;
x
x=y=z *如果y=z則x=1否則為0;
指派陳述式變數通過運算式計算後的類型有三種情況《是可執行語句》
數值型=數值型+數值型
字元型=字元型+字元型
數值型=數值型+字元型 (註:後面兩個位置可以互換,例如x="1"+2,如果不能轉換,日誌視窗會報錯)
rename語句
keep語句先於rename語句編譯,兩者都是不可執行語句.
rename y=yy;
keep x y;
rename選項一定要對所有重新命名的變數用括弧括起來
結果變數長度
字元型長度為1;數值型長度為8;
變數長度由第一次讀入的運算式的運算結果決定,如char="ab";那麼char的長度為3,無論下一次pdv讀入多長的資料,都只會顯示兩個位元組,如果在之前用length語句實現定義char的長度,那麼就可以解決這個問題。
LENGTH variable-specification(s)<DEFAULT=n>;
length m 5;
length m1 m2 7; *m1,m2兩個長度都是7;
length m1 4 m2 6;
lenght m1 3 m2 $8;規定第二個為字元型的變數
累加語句與retain語句的區別《是可執行語句》
variable+expression
例如 x+1 x+(-1) 不能寫成x-1 x+(y=z)
在編譯階段pdv自動將累加變數設定為0,如果想要其不為0,那麼要用retain語句代替,累加語句可以視為retain的一個特例
Keep,drop語句《不可執行檔語句》
Tips:(keep選項和keep語句的區別)
data a1; set sashelp.class(keep= name sex);/* keep name sex;*/ *如果使用keep語句而不使用keep選項,那麼pdv會讀入先所有的變數再保留需要保留的,而用keep=選項則能保持每次唯讀入需要讀入的變數;
set sashelp.class(keep = _character_); *唯讀入字元型變數;
set sashelp.class(keep = _numeric_); *唯讀入數值型變數;
run;
drop語句的用法和keep一樣,套著用就行,另外drop=選項的效率也高於drop語句。
retain語句《不可執行檔語句》
這個比較重要了,我先解釋下sas的運行機制
sas的data步和run語句之間其實是一個迴圈,比如當使用set語句的時候,每次set一條觀測,一直運行到run;再返回程式開頭,繼續set第二條觀測值,一直將資料集的觀測值讀取完。
系統每讀一遍data步的所有語句時,pdv都會將所有變數設定為缺失值,在sas中用“.”表示。然後在進行接下來的其他語句時,再對變數進行賦值。但是如果我們在data步用到了retain語句
pdv就不會清空retain語句對應的變數,而是一直保留到下次改變了再被執行的時候,這樣就能完成我上面說的初始值不為0的累加情況了
data a1; retain m1-m5 (1); *m1為1其餘權威缺失值; retain m1-m5 1; *m1-m5全為1; retain m1-m5 (1,2,3,4,8); *給每個賦予不同的值,和下面的沒區別,需要分開執行; retain m1-m5 (1 2 3 4 5);
retain m1-m5 (1:5); put m1-m5;run;
libname chapt4 ‘E:\sas-data\Book_data\Book_data\chapt4‘;
proc sort data=chapt4.retain1;by id ;run;
data a1;
set chapt4.retain1;
by id ;
retain cns_sum id_cnt txn_cde_conditon txn_dte_min; *如果省去retain txn_dte_min則每次迴圈,其值會為缺失值;
if first.id then do;
cns_sum=0;
id_cnt = 0;
txn_cde_conditon=0;
txn_dte_min=txn_dte;
end;
put cns_sum=;
cns_sum+cns; *但是如果不用省去前面的retain cns_sum id_cnt txn_cde_conditon,這些值不會出現錯誤,當不出現指派陳述式的時候,只是累加,這些值在每輪迴圈中不會被置為缺失值,還是會有retain的效果;
id_cnt+1;
txn_cde_conditon+(txn_cde in ("101" "201"));
put txn_dte_min= txn_dte=;
txn_dte_min=min(txn_dte,txn_dte_min);*但是有指派陳述式,就不能丟掉retain語句;
if last.id;
put "last.id";
run;
下面是資料集