SAS中文论坛

标题: 对于SET语句的一个误解 [打印本页]

作者: shiyiming    时间: 2014-3-31 22:30
标题: 对于SET语句的一个误解
大多数SAS程序员非常熟悉SET语句,以至于在平时使用过程中并不洞悉它的运行机制。但是在某些情况下,SET语句的运行结果并没有如我们所预期的结果那样实现。我们现在看看这个例子:

我们的原意可能是数据集b中如果z缺失就把y值赋为999,结果因为数据集a中没有z变量,以至于y全部都变成了999。

如何解决?很简单,用IN=选项,指定在处理数据集b时才应用999赋值逻辑。

我们再看看,最后一条记录还是不对。那是因为SET语句并不会更新PDV中的值,除非那个是计算变量或者被申明赋值了,显然本例没有这种情况。其次如果该变量是数据步创建的,其初值在数据步每次内循环中会自动设置为缺失,如果像本例一样变量是从数据集中读取的,那么其初值就不会是自动赋缺失。呢么如何解决这个问题呢?更简单用RETAIN语句赋y的初值为缺失。

希望大家今后在使用SET语句时好好思考一下你的程序是不是你想要得到想要的结果,其中有不少玄机的。

作者: webgu    时间: 2014-3-31 22:55
亲自操刀了?
看来我的画图系列该弄了。
作者: shiyiming    时间: 2014-3-31 22:57
对的,有空就稍微写一点练练手。
作者: stata    时间: 2014-3-31 22:59
webgu 发表于 2014-3-31 22:55
亲自操刀了?
看来我的画图系列该弄了。

期待中!
作者: stata    时间: 2014-3-31 23:08
[attach]54[/attach]

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

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

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

希望管理员多发类似的帖子,谢谢!
作者: slash    时间: 2014-3-31 23:28
这东西不经常用真的忘记了!刚开始看的时候还真没想通为什么最后一条观测的y是999,看了半天才反应过来原来是从第7条观测的y值遗留过来的!

作者: zhaizhongping    时间: 2014-3-31 23:33
很好的SAS基础训练贴。
作者: wpfwxn    时间: 2014-4-10 11:09
楼主对set a; set b;这种格式有没有研究?
作者: berry_li    时间: 2014-12-9 13:31
wpfwxn 发表于 2014-4-10 11:09
楼主对set a; set b;这种格式有没有研究?

新数据集包含输入数据集的所有变量,观测为原始数据集较小的观测数。比如a,b共有6个不同的变量,分别有6、9条观测,则最后的结果是6条观测,6个变量。
它们是严格的one-to-one Reading,也就是说,a的第一条观测和b的第一条观测set,a的第二条观测和b的第二条观测set,直到某一数据集读完就停止了。
另外,若变量名相同,来自后一个数据集的值会完全替代前面的值,但变量属性(length,label,format,informat,etc)由前面的决定。
若变量名相同而类型不同,则报错。
作者: haobq2008    时间: 2014-12-9 17:19
楼主,请用merge语句,轻松实现。




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