什麼是pdv
個人認為可以把pdv想象成一排用於存放變數值的盒子。每個盒子代表乙個變數。
提交乙個data步後,sas會對這個data步進行編譯,然後執行。
首先,pdv是在data步的編譯階段生成的。(編譯會進行語法檢查並建立一排整齊擺放的」盒子」
);然後,在data步的執行階段,根據不同語句對pdv中變數的值進行清空或更改。(將盒子清空或換上新的物品
);最後,在run;語句或者output;語句將pdv中變數的當前值輸出到目標資料集中。keep,drop語句或keep=,drop=資料集選項會影響輸出到目標資料集中變數的個數。(如果沒有keep/drop,將新建變數和資料集變數對應的盒子搬出到目標資料集;如果只有keep,則只搬keep指定的盒子;如果只有drop,則不搬drop指定的盒子;如果keep/drop同時存在,則只搬keep-drop後剩下的盒子
)pdv中變數的個數及順序
data步中所涉及到的所有的變數,包括新建立的、從其他資料集讀取的(set)、以及自動生成的變數。自動生成的變數包括:_error_,_n_; 或是first.var,_iorc_等由某個語句或選項所自動產生的變數。預設情況下,自動生成的變數不會輸出到目標資料集中。
pdv中變數按照先來後到的原則,是根據其在data步中第一次出現的位置決定整個pdv中的變數順序。同樣,這是在data步的編譯階段確定的。(在set語句中,資料集選項in=所指定的變數會在資料集變數之前)put _all_; 語句會將pdv中所有的變數按照其在pdv中的順序輸出到log中。
例如下面這個例子:
data test;
aaa=1;
set sashelp.class(keep=name *** in=in1);
by name;
bbb="bbb";
set sashelp.class(keep=age weight height in=in2);
put _all_;
run;
在pdv中共有13個變數,包括兩個新建立的(aaa,bbb),5個資料集中的,6個自動生成的(in1,first.name,last.name,in2, _error_, _n_)。
順序為:aaa, in1, name, ***, first.name, last.name, bbb, in2, age, weight, height, _error_,_n_。
關於pdv中變數值的
retain
一般情況下,data步的執行是乙個迴圈的過程,也就是sas執行到data步最後一句後會預設回到data語句繼續執行。在回到data語句再次執行這個data步的**的時候,就會涉及到是否對pdv中變數已有的值清空,這就是retain要做的。
(這裡用「一般情況下」,是因為有些情況下,sas不會回到data語句,而是在run;語句就結束了。如:
*** no data read from outside;
data a;
put _all_;
x=1;
run;
*** no data read from the first iteration(_n_=1);
data b;
x=2;
put _all_;
if x=1 then set sashelp.class;
run; )
回到pdv:
a. 在data步剛開始執行的時候:
自動生成變數會被附上初始值:_n_=1, _error_=0,first.var=1, last.var=1, 等等;
如果retain語句對某變數設定了的初始值,則對應的變數被設為指定的值;
sum語句(如a+1;)的變數會被初始化為0;
其他的變數,包括新建變數和set的資料集對應的變數都會被設為空值。
b. 當sas執行過程中再次回到data語句時:
自動生成變數的值會被retain;
如變數來自retain語句、sum語句、或資料集中,則變數值會被retain;
其他的變數會被置空。
例如,可以根據下面data步所產生的log來判斷變數的retain情況:
proc sort data=sashelp.class out=class;
by age;
run;
data test;
put "******************************=";
put "at begnning: " _all_;
aaa=_n_;
set class(keep=name age in=in1);
by age;
bbb+age;
retain ccc 0; ccc=age+ccc;
retain ddd; ddd=sum(ddd,age);
put "at ending : " _all_;
run;
SAS中的if過濾語句
在sas中,if語句和where語句都有過濾作用,請看如下兩端 其效果是相同的 data a set sashelp.class if eq 男 run data a set sashelp.class where eq 男 run if 過濾語句的基本語法為 if 條件 其完整形式應該是 if 條...
SAS中的排序語句proc sort
常用寫法 適用情況 每日一問 proc sort data database out newdatabase nodupkey by all run 如果可以覆蓋原資料集,可以直接省略out步 nodupkey需要和後面的by語句一起使用,並且給by後面的變數排序後,僅根據by變數剔重 如果原資料集...
SAS中的summary過程簡介
summary過程主要用來對數值變數計算單個變數的基本統計量,使用語句與means過程類似。預設時summary過程不列印輸出計算結果。必須指定print選項才能輸出計算結果。語法格式 proc summary 選統計關鍵 var 變數名1變數名2 by 變數名1變數名2 class 變數名1變數名...