2014-09-26 102 views
1

我想在sas中做一个递归滞后,我刚刚学到的问题是x = lag(x)在SAS中不起作用。sas递归滞后编号

我的数据在格式上此类似:

id  date   count  x 
a  1/1/1999  1   10 
a  1/1/2000  2   . 
a  1/1/2001  3   . 
b  1/1/1997  1   51 
b  1/1/1998  2   . 

我要的是,对于第一计数定x,我希望通过ID每个连续的X是滞后(X)+一些不变。

例如,让我们说:如果计数> 1,则x =滞后(X)+ 3. ,我希望的输出是:

id  date   count  x 
a  1/1/1999  1   10 
a  1/1/2000  2   13 
a  1/1/2001  3   16 
b  1/1/1997  1   51 
b  1/1/1998  2   54 

回答

4

是的,在SAS的滞后功能需要一些了解。你应该通读它的文档(http://support.sas.com/documentation/cdl/en/lefunctionsref/67398/HTML/default/viewer.htm#n0l66p5oqex1f2n1quuopdvtcjqb.htm

当你有条件语句滞后于“那么”,我倾向于使用保留的变量。

data test; 
input id $ date count  x; 
informat date anydtdte.; 
format date date9.; 
datalines; 
a  1/1/1999  1   10 
a  1/1/2000  2   . 
a  1/1/2001  3   . 
b  1/1/1997  1   51 
b  1/1/1998  2   . 
; 
run; 

data test(drop=last); 
set test; 
by id; 
retain last; 
if ^first.id then do; 
    if count > 1 then 
     x = last + 3; 
end; 

last = x; 
run; 
+1

由于@DomPazz提到的原因,我几乎总是在'lag()'上使用'retain'。使代码不太可能包含一个错误是一个很好的标准 - 尤其是一个难以被双方意识到和解决的错误,作为一个“滞后”错误。只有当我需要'lag1(),lag2()....,lagN()'时,才会使用'lag()'。只有在这种情况下才比使用保留IMO更好。 – 2014-09-26 23:29:16