这是我的程序的一部分。(oldindex和oldreadmit保留赞扬)
问题是它适用于oldindex = 1然后readmit = 1但不起作用滞后(oldreadmit)= 1然后readmit = 1。你能告诉我这是什么问题吗?提前谢谢!
else if 0< gap <= 30 then do;
index_d=0;
if lag(oldreadmit)=1 or oldindex=1 then readmit=1;
else oth=1;
oldindex=index_d;
oldreadmit=readmit;
end;
简
答案 0 :(得分:9)
SAS lag
功能引起了很多混乱,但一旦你理解了它是如何工作的,那就有意义了。假设您有3个观察值,并且您有一个if语句,导致在处理过程中跳过第二个观察。如果然后将滞后函数应用于第三个观察,它将返回第一个观察,而不是第二个,因为上次处理任何观察时都是第一次观察。
这意味着,在组合滞后和if语句时要小心。在您的代码中,您只有在if
语句为真时才会执行的子句中存在延迟。这会给你带来奇怪的结果。你应该做的是定义一个变量,比如l_oldreadmit
,以等于之前的滞后在if语句中使用它。
这将有效:
l_oldreadmit = lag(oldreadmit);
if (... whatever you have here ...);
else if 0< gap <= 30 then do;
index_d=0;
if l_oldreadmit=1 or oldindex=1 then readmit=1;
else oth=1;
oldindex=index_d;
oldreadmit=readmit;
end;
答案 1 :(得分:4)
使用滞后函数的另一个提示是,从版本9开始,您可以使用IFN和IFC函数,这些函数不会违反标准IF语句遇到的问题。看看下面代码的结果,你会明白我的意思。
data test;
input col1;
if col1>0 then col2=lag(col1);
col3=ifn(col1>0,lag(col1),.);
cards;
1
2
0
5
0
4
;
run;
有关更详细的解释,这里有一篇关于这个主题的好文章。 http://www.howles.com/saspapers/CC33.pdf
答案 2 :(得分:1)
正如Itzy所说,lag
功能的意外行为令人困惑。幸运的用户会立即遇到问题,不幸的用户可能会在意识到存在问题之前花很长时间(如果有的话)。出于这个原因,我完全避免了滞后功能。错误地使用它太容易了,我想保护自己免于犯错,这些错误很容易避免。这样我就可以花更多的时间编写代码,减少调试时间。
我建议只使用retain
语句。每个人都理解它是如何工作的以及变量之间的关系,retain
语句和if
语句是很好理解的。
答案 3 :(得分:0)
LAG函数可能会引起混淆,因为它不会从先前的观察中返回变量的值,而是从队列中返回。队列根据上次调用的时间进行填充。一篇关于这个主题的文章 -