2013-04-22 182 views
4

我正試圖用設置的條件填充一個變量。如何在SAS中找到變量的前一個值

如果變量NUMBER等於。然後使其等於Number的前一個值。

data table2; 
    set table1; 

    prv_value = lag(number); 
    if number = . then number = prv_value; 
run; 

但是,如果在一行中有兩個值其中number =。那麼第二次出現的值就是。它是以前的數值=的值。 。

我想要的是找到第一個以前發生的數字不等於。並使數字的值等於先前的非缺失值。

我的數據的一個例子是:

id number 
d10 2  
d10 2  
d10 3  
d10 .  
d10 .  

應用上面的代碼,然後我會得到:

id number prv_number 
d10 2  . 
d10 2  2 
d10 3  2 
d10 3  3 
d10 .  . 

我想的是:

id number prv_number 
d10 2  . 
d10 2  2 
d10 3  2 
d10 3  3 
d10 3  . 

也就是說,如果數有一個值。然後使其等於第一個以前發生的非缺失值。

在某些情況下,在我的數據集我可能有:

id number 
d10 4 
d10 2 
d10 . 
d10 . 
d10 . 
d10 . 

和我想的是:

id number 
d10 4 
d10 2 
d10 2 
d10 2 
d10 2 
d10 2 

(注意,我的數據是在事件/時間順序進行排序,因此想要第一次發生)。

有什麼我可以用滯後函數在不同的先前發生次數上做什麼,或者其他什麼可以做我想做的事情?

+0

埃米爾的答案使用保留是要走的路。對於幾乎所有的情況,我都建議不要使用「滯後」函數,因爲它的語義臭名昭着,很難識別錯誤。 – 2013-04-22 16:08:40

回答

6

你可以嘗試使用如下語句保留(未經測試):

data table2; 
    set table1; 

    retain prv_value .; 

    if number=. then 
    number=prv_value; 

    if number ne . then 
    prv_value=number; 
run; 

問候, 阿米爾。

+0

嗨@Amir,我不認爲這是我想要的。我試了一下,我的值​​和以前一樣。 – Ellie 2013-04-22 12:10:58

+0

嗨@Ellie我嘗試了您的示例中的數據,並且「數字」已填充,如您所示。當您運行我建議的代碼時,您的示例會得到什麼結果? – Amir 2013-04-22 12:47:39

+0

我已經得到它現在的工作。所以prv_value不是一個現有的變量(我正在使用prv_value等於編號-prv_number的延遲)並且在該數據步驟中創建。謝謝你的幫助。 – Ellie 2013-04-22 13:15:39

相關問題