shiyiming 发表于 2014-3-31 22:30:28

对于SET语句的一个误解

大多数SAS程序员非常熟悉SET语句,以至于在平时使用过程中并不洞悉它的运行机制。但是在某些情况下,SET语句的运行结果并没有如我们所预期的结果那样实现。我们现在看看这个例子:
http://blogs.sas.com/content/sgf/files/2014/02/SET1AB1.jpg
我们的原意可能是数据集b中如果z缺失就把y值赋为999,结果因为数据集a中没有z变量,以至于y全部都变成了999。
http://blogs.sas.com/content/sgf/files/2014/02/SET4.jpg
如何解决?很简单,用IN=选项,指定在处理数据集b时才应用999赋值逻辑。
http://blogs.sas.com/content/sgf/files/2014/02/SETIN.jpg
我们再看看,最后一条记录还是不对。那是因为SET语句并不会更新PDV中的值,除非那个是计算变量或者被申明赋值了,显然本例没有这种情况。其次如果该变量是数据步创建的,其初值在数据步每次内循环中会自动设置为缺失,如果像本例一样变量是从数据集中读取的,那么其初值就不会是自动赋缺失。呢么如何解决这个问题呢?更简单用RETAIN语句赋y的初值为缺失。
http://blogs.sas.com/content/sgf/files/2014/02/SETRIGHT2.jpg
希望大家今后在使用SET语句时好好思考一下你的程序是不是你想要得到想要的结果,其中有不少玄机的。

stata 发表于 2014-3-31 23:08:34



不用in实现,看起来更清楚点吧!

webgu 发表于 2014-3-31 22:55:12

亲自操刀了?
看来我的画图系列该弄了。

shiyiming 发表于 2014-3-31 22:57:45

对的,有空就稍微写一点练练手。

stata 发表于 2014-3-31 22:59:18

webgu 发表于 2014-3-31 22:55
亲自操刀了?
看来我的画图系列该弄了。

期待中!

shiyiming 发表于 2014-3-31 23:11:13

stata 发表于 2014-3-31 23:08
不用in实现,看起来更清楚点吧!

对的,很棒!只是为了解释SET语句的用法,让大家看清楚哪里有陷阱。

stata 发表于 2014-3-31 23:21:43

shiyiming 发表于 2014-3-31 23:11
对的,很棒!只是为了解释SET语句的用法,让大家看清楚哪里有陷阱。

希望管理员多发类似的帖子,谢谢!

slash 发表于 2014-3-31 23:28:22

这东西不经常用真的忘记了!刚开始看的时候还真没想通为什么最后一条观测的y是999,看了半天才反应过来原来是从第7条观测的y值遗留过来的!

zhaizhongping 发表于 2014-3-31 23:33:17

很好的SAS基础训练贴。

wpfwxn 发表于 2014-4-10 11:09:32

楼主对set a; set b;这种格式有没有研究?
页: [1] 2
查看完整版本: 对于SET语句的一个误解