2013-03-05 77 views
2

雖然我在閱讀使用SAS數據步驟時概念化程序數據向量的相當多內容,但我仍不明白分組處理時PDV是如何工作的。例如,如果我有數據集olddata瞭解分組處理中的SAS PDV

GROUP VAL 
A  10 
A  5 
B  20 

而且我通過聲明呼籲它datastep用,如:

data newdata; 
set olddata; 
by group; 
... 
run; 

那麼編譯器增加了兩個臨時變量的PDV:第一。組和last.group。當你在閱讀PDV任何教程,它會告訴你,在SET語句的第一關,PDV看起來像:

_N_ _ERROR_ FIRST.GROUP LAST.GROUP GROUP VAL 
    1   0    1   0  A 10 

和LAST.GROUP爲零,因爲觀察1不是最後一個觀察在A組中。

這裏是我的問題:SAS如何知道這不是最後的觀察?

如果SAS正在逐行處理olddata,PDV如何意識到下一行包含另一個組A觀察而不是新組?換句話說,SAS似乎必須使用來自之前或未來行的信息來更新FIRSTLAST變量,但我不知道如何。當BY聲明被調用時,PDV如何保持行與行之間的值是否存在一些竅門?

回答

1

SAS實際上會向前看下一條記錄,看它是否應該設置LAST。(var)或不。不幸的是,我一直無法找到一篇文章詳細解釋這一點。我有點失望,看到像http://www.wuss.org/proceedings09/09WUSSProceedings/papers/ess/ESS-Li1.pdf這樣的論文只是關於如何確定LAST。

SAS也向前看,看是否應該設置END =變量,指定時,以及其他一些事情。這不僅僅是使用元數據來確定它們;您可以在不修改元數據的情況下刪除或修改記錄,並且它仍然可以工作 - 並且沒有通常SAS元數據的SQL表格仍然允許您執行正常的BY組處理等。

當然,FIRST變量不需要後視,它記得它畢竟是在哪裏。

編輯:我把這個交給了SAS-L,並得到了相同的答案 - 似乎沒有任何有關該主題的文檔,但它必須提前閱讀。例如,請參閱http://listserv.uga.edu/cgi-bin/wa?A1=ind1303a&L=sas-l#8。編輯2:從SAS-L,Dan Nordlund鏈接到證實這一點的論文。 http://support.sas.com/resources/papers/proceedings12/222-2012.pdf

該論文的邏輯確認了超前性 - 查看從數據集中讀取的觀測值的數量。

DATA DS_Sample1;   
Input Sum_Var 
Product;  
Cards;     
100 3     
100 2     
100 1     
;     
*With BY statement - reads 3 observations even though it stops after 2.; 
DATA DS_Sample2;  
    Set DS_Sample1;   
    by Sum_Var;    
    cnt+1; If CNT > 1 then stop; 
Run; 
*no BY statement - reads 2 observations as expected; 
DATA DS_Sample2;  
    Set DS_Sample1;   
    cnt+1; If CNT > 1 then stop; 
Run; 
* END statement - again, a lookahead; 
DATA DS_Sample2;  
    Set DS_Sample1 end=eof; 
    cnt+1; If CNT > 1 then stop; 
Run; 
+0

謝謝喬。我們可能找到了類似的東西。令人失望的是,對PDV的數據步驟處理的描述顯然不完整。據推測,某種預讀緩衝區與PDV是分開的,但就像你說的那樣,似乎沒有任何關於發生什麼的好的描述。 – Carl 2013-03-05 20:29:24

+0

使用SAS-L討論中的鏈接進行編輯。 – Joe 2013-03-05 20:51:57

+0

感謝您的跟蹤。因此,對我來說,似乎很奇怪,在SAS中有類似於lead()這樣的函數的問題太多了。通常的基本原理是SAS的逐行處理模式。但是,如果有預讀機制,那麼似乎應該使用該機制來使用「lead()」或類似的函數。 – Carl 2013-03-05 21:04:08