SAS中文论坛

标题: lag函数的运行机制 [打印本页]

作者: shiyiming    时间: 2008-8-6 19:13
标题: lag函数的运行机制
找了一些资料,发现lag函数的运行机制大概是这样:
1.lag(x)是一个队列(queue)函数,每次执行,从队列的起始读取数值并将该值移除出队列,队列中的剩余值上移,x的当前值进入队列末尾。因此首次执行后,lag(x)值为missing,队列中只有1个值--即x的当前值。
2.只有当lag(x)被执行后,x的当前值才会被读入队列中。因此,如果使用条件语句,不符合条件时,lag(x)不被执行,当前的x值也不会进入队列,从而不会出现在lag(x)的结果中。
3.SAS语句内的lag函数是无关的,即使执行的是同样的lag(x)。

<!-- m --><a class="postlink" href="http://support.sas.com/documentation/cdl/en/lrdict/59540/HTML/default/a000212547.htm">http://support.sas.com/documentation/cd ... 212547.htm</a><!-- m -->
<!-- m --><a class="postlink" href="http://support.sas.com/documentation/cdl/en/etsug/60372/HTML/default/etsug_tsdata_sect048.htm">http://support.sas.com/documentation/cd ... ect048.htm</a><!-- m -->
<!-- m --><a class="postlink" href="http://support.sas.com/forums/thread.jspa?messageID=11673&amp;#11673">http://support.sas.com/forums/thread.js ... 673&amp;#11673</a><!-- m -->

Example:
[code:9r9ctlh0]
data test ;
   input x @@;
   y1=lag(x);
   y2=1;
   y3+1;
   
   if y1&gt;0 then z1=y1;
   if y1&gt;0 then z2=lag(x);
   if y2&gt;0 then z3=lag(x);
   if lag(x)&gt;0 then z4=y1;
   if lag(x)&gt;0 then z5=lag(x);
   if y3 in(1,2,5,6) then z6=lag(x);
   
   datalines;
   1 2 3 4 5 6
   ;
run;

输出结果:
                          Obs    x    y1    y2    y3    z1    z2    z3    z4    z5    z6

                           1     1     &#46;     1     1     &#46;     &#46;     &#46;     &#46;     &#46;     &#46;
                           2     2     1     1     2     1     &#46;     1     1     &#46;     1
                           3     3     2     1     3     2     2     2     2     2     &#46;
                           4     4     3     1     4     3     3     3     3     3     &#46;
                           5     5     4     1     5     4     4     4     4     4     2
                           6     6     5     1     6     5     5     5     5     5     5
[/code:9r9ctlh0]
作者: shiyiming    时间: 2008-8-7 09:46
标题: Re: lag函数的运行机制
这个lag曾经费了我牛劲了,而且lagn(x)会有n个缺失值……执行到n+1次时才是我们要的值
作者: shiyiming    时间: 2008-8-11 16:14
标题: Re: lag函数的运行机制
不是很理解'if y1&gt;0 then z2=lag(x);'这句code.为什么会有两个缺失值?请高手解释一下,多谢!
作者: shiyiming    时间: 2008-8-12 20:13
标题: Re: lag函数的运行机制
[quote=&quot;amanda&quot;:1wxijnem]不是很理解'if y1&gt;0 then z2=lag(x);'这句code.为什么会有两个缺失值?请高手解释一下,多谢![/quote:1wxijnem]
_N_=1时,y1=.,y1&gt;0的结果是false,则&quot;z2=lag(x)&quot;没有被执行,z2被赋值为missing
_N_=2时,y1=1,y1&gt;0的结果是true,则继续执行z2=lag(x):SAS创建lag(x)的队列,并初始化赋值为missing,然后从队列的起始读取数值(=missing),并将该值移除出队列,赋给z2(=missing),同时x的当前值(2)进入队列。
_N=3 ......
作者: shiyiming    时间: 2008-8-28 09:51
标题: Re: lag函数的运行机制
不太懂最后一句,
if y3 in(1,2,5,6) then z6=lag(x);
如果是这样的话,不应该是x=3进入吗?那么z6为什么等于5?




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2