2013-04-22 125 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

相关问题