賦值語句
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 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語句《不可執行的語句》retains values from the previous iteration of the DATA step
這個比較重要了,我先解釋下sas的運行機制
sas的data步和run語句之間其實是一個循環,比如當使用set語句的時候,每次set一條觀測,一直運行到run;再返回程序開頭,繼續set第二條觀測值,一直將數據集的觀測值讀取完。
系統每讀一遍data步的所有語句時,pdv都會將所有變量設置為缺失值,在sas中用“.”表示。然后在進行接下來的其他語句時,再對變量進行賦值。但是如果我們在data步用到了retain語句
pdv就不會清空retain語句對應的變量,而是一直保留到下次改變了再被執行的時候,這樣就能完成我上面說的初始值不為0的累加情況了
retain的基本語法
RETAIN variable-list; list中的值都為缺失
RETAIN variable-list initial-value; 為list中的值設定初始值value
sum語句也能達到retain的效果
variable + expression;
The variable must be numeric and has the initial value of zero.
This statement adds the value of the expression to the variable while retaining the variable’s value from one iteration of the DATA step to the next。
下面兩句和sum語句起到的效果一樣
retain variable 0;
variable = sum(variable+expression);
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;
下面是數據集

