对于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语句时好好思考一下你的程序是不是你想要得到想要的结果,其中有不少玄机的。
不用in实现,看起来更清楚点吧!
亲自操刀了?
看来我的画图系列该弄了。 对的,有空就稍微写一点练练手。 webgu 发表于 2014-3-31 22:55
亲自操刀了?
看来我的画图系列该弄了。
期待中! stata 发表于 2014-3-31 23:08
不用in实现,看起来更清楚点吧!
对的,很棒!只是为了解释SET语句的用法,让大家看清楚哪里有陷阱。 shiyiming 发表于 2014-3-31 23:11
对的,很棒!只是为了解释SET语句的用法,让大家看清楚哪里有陷阱。
希望管理员多发类似的帖子,谢谢! 这东西不经常用真的忘记了!刚开始看的时候还真没想通为什么最后一条观测的y是999,看了半天才反应过来原来是从第7条观测的y值遗留过来的!
很好的SAS基础训练贴。 楼主对set a; set b;这种格式有没有研究?
页:
[1]
2