SAS中關於PDV的總結

2021-07-03 04:15:09 字數 2453 閱讀 9316

什麼是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變數名...