sas指派陳述式,累加語句,keep,drop,rename,retain

來源:互聯網
上載者:User

標籤: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;

 下面是資料集

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.