2017-03-01 50 views
-1

需要创建一个新变量来重复ID访问的最早日期,如果遗漏了该变量,则应该输入遗漏,遗漏后应该保留最早的日期失踪了(就像在这个例子中)。我试过LAG功能,但没有工作;我也尝试保持功能,但只是重复所有记录的25NOV2015。最后的结果/“我需要的”在最后一栏。SAS-如何保持考虑缺失的最早日期

感谢

Example

回答

0

您需要使用retain声明。保留意味着你在每个观察中的价值不会被重新初始化为失踪。因此,在数据步骤的下一次迭代中,变量会记住它的值。

的样本数据

data a; 
    input date; 
    format date ddmmyy10.; 
datalines; 
. 
5 
6 
7 
. 
1 
2 
. 
9 
; 
run; 

解决方案

data b; 
    set a; 

    retain new_date; 
    format new_date ddmmyy10.; 

    if date = . then 
     new_date = .; 

    if new_date = . then 
     new_date = date; 
run; 
+0

太谢谢你了罗伯特。但是,如果我尝试使用多个ID?我试图把数据b; 设置一个; BY ID; – Anna

+0

它没有工作。抱歉。你能帮我吗? – Anna

+0

请将您的代码粘贴到问题上。 –

0

既然你没有张贴任何资料,我会弥补一些。另外,由于你的变量是一个日期的事实并没有真正影响到答案,所以我将使用一些整数,因为它们更容易输入。

data have ; 
    input id value @@ ; 
cards; 
1 . 1 2 1 3 1 . 1 5 1 6 1 . 1 8 
2 1 2 2 2 3 2 . 2 5 2 6 
;;;; 

基本上你的算法说,当你想要存储当前值丢失或存储值丢失时的值。对于多个BY组,当您启动一个新组时,您也需要设置它。

data want ; 
set have ; 
by id ; 
retain new_value ; 
if first.id or missing(new_value) or missing(value) 
    then new_value=value; 
run; 

结果:

     new_ 
Obs id value value 

    1  1  .  . 
    2  1  2  2 
    3  1  3  2 
    4  1  .  . 
    5  1  5  5 
    6  1  6  5 
    7  1  .  . 
    8  1  8  8 
    9  2  1  1 
10  2  2  1 
11  2  3  1 
12  2  .  . 
13  2  5  5 
14  2  6  5 
+0

汤姆,非常感谢你,对我来说非常重要,有一个解决方案。我是新来的,对不起,我没有发布任何数据,我很迷茫。再次感谢你!有用! – Anna