在SAS

3

有條件保持變量我有這樣的SAS示例代碼:在SAS

data BEFORE; 
    input v1 v2; 
datalines; 
1 2 
; 

data AFTER; 
    put 'Before IF: ' _ALL_; 
    if _N_ = 1 then set BEFORE; 
    put 'After IF : ' _ALL_; 
run; 

輸出是:

BEFORE: v1=. v2=. _ERROR_=0 _N_=1 
AFTER : v1=1 v2=2 _ERROR_=0 _N_=1 
BEFORE: v1=1 v2=2 _ERROR_=0 _N_=2 
AFTER : v1=1 v2=2 _ERROR_=0 _N_=2 

和輸出文件包含:

Obs v1 v2 
1  1  2 
2  1  2 

我知道, SET會導入並保留BEFORE數據集的變量,但爲什麼BEFORE的記錄會被重複?

回答

2

我跑你的示例代碼,而你忽略的信息的關鍵部分:該消息是在SAS日誌:「注:數據步停止由於循環」。谷歌搜索該消息導致我a SAS paper describing the error。它建議不使用IF語句SET語句之前,而是利用OBS =數據集選項來限制讀取觀測次數。

所以,你會改變線路:

if _N_ = 1 then set BEFORE; 

到:

set BEFORE(obs=1); 

當我跑到你的代碼這一變化,「如果說之前:」行仍印刷兩次,我米不知道爲什麼這樣。但循環注沒有發生,所以我相信這是解決方案。

+0

SAS將無限執行,直到它找到文件標誌的結束。它執行一次,保留變量。再次執行,複製保留的值並終止。 – 2011-01-27 16:16:35

0

的SET是一個可執行語句,也就是說,除非被執行,它不會重置變量或執行數據跳躍時加載下一個觀察的數據。 (它設置或改變PDV當數據步驟被編譯,雖然。)由於如果條件的,它僅執行一次。

底部的隱式OUTPUT語句輸出每次迭代的觀察。 SAS,監測,看是否有數據步驟無限循環,停止第二次迭代之後的數據步驟併產生音符。