SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1032|回复: 4
打印 上一主题 下一主题

lag函数的运行机制

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-8-6 19:13:47 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-8-7 09:46:03 | 只看该作者

Re: lag函数的运行机制

这个lag曾经费了我牛劲了,而且lagn(x)会有n个缺失值……执行到n+1次时才是我们要的值
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-8-11 16:14:20 | 只看该作者

Re: lag函数的运行机制

不是很理解'if y1&gt;0 then z2=lag(x);'这句code.为什么会有两个缺失值?请高手解释一下,多谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-8-12 20:13:11 | 只看该作者

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 ......
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-8-28 09:51:52 | 只看该作者

Re: lag函数的运行机制

不太懂最后一句,
if y3 in(1,2,5,6) then z6=lag(x);
如果是这样的话,不应该是x=3进入吗?那么z6为什么等于5?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 22:03 , Processed in 0.094868 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表