全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3319 8
2017-04-15
近来复习时有一点疑惑,望各位老师解答。
给人的感觉似乎If和Where语句都可用来控制分类。

用where实现subset例子可见于sas base 70题里的第25题:
proc print data=SASHELP.CLASS(firstobs=5 obs=15);
where Sex='M';
-------------------
run;

这里我们知道只有性别为男才会被proc print执行。

用if来实现subset例子同样可见于sas base 70题里的第20题:
data WORK.OUTDOOR WORK.CLOTH WORK.EQUIP;
set WORK.PRODUCTS;
if Sales GT 30;

------------------
这里我们知道只有sales大于30的才会往下执行。

那么,这两者能互换使用吗?还是说,where来控制subset时只能在proc step里,而用if来筛选时只能在data step?
手头机器SAS被卸载了不能跑,所以求解惑一下,多谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-4-15 00:07:38
正好在看base 95题里的第94题,似乎印证了这个疑问:

94. Given the following SAS error log
44 data WORK.OUTPUT;
45 set SASHELP.CLASS;
46 BMI=(Weight*703)/Height**2;
47 where bmi ge 20;
ERROR: Variable bmi is not on file SASHELP.CLASS.
48 run;
What change to the program will correct the error?
A. Replace the WHERE statement with an IF statement
B. Change the ** in the BMI formula to a single *
C. Change bmi to BMI in the WHERE statement
D. Add a (Keep=BMI) option to the SET statement

所以答案是A吗?where用来实现subset的条件是放在proc step里?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-15 01:06:52
自己又思考了下base的第94题。
其实问题不在where作用的范围,where是既可以在proc也可以用在data step里的(反之,if subset却只能作用于data step)
症结在于,bmi是这个data step里新创建的变量。而where语句试图从前头的SASHELP.CLASS这个set里去筛选,可bmi压根不在原set里所以报错。
因此换成if才能做判断筛选新变量。

答案C有一定的诱惑性,但SAS根本不在乎执行时变量的大小写。(除非是严格的字符比较)

这题真是满满的恶意和坑呐!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-17 14:45:29
在SAS中,where和if的区别,应该算是一个经典问题了,论坛中也有各位大神做了较为详细的解释……
准确来说if语句应该是指有筛选观测功能的子集if语句。其实where和if的主要区别主要体现在两者不同的作用区域。
在DATA步中,SAS处理数据主要通过PDV这个数据结构,而且where和if的区别就围绕着PDV来进行的。
where语句的作用范围在PDV之前,也就是数据进入PDV前先行筛选,未满足where条件的不会进入PDV,也就不会进行后续处理。

这也是楼主所举例中题目的核心。 BMI不是set语句后输入数据集中存在的变量,是用赋值语句新建立的变量,where语句在PDV前先行筛选数据,此时BMI对于where语句是不可见的,也就会报错了。总结为简单一句话,where语句后条件表达式中所出现的变量必须是输入数据集中所存在的变量。也正因为如此,如果非要使用新建立的变量进行筛选,可以考虑使用子集if语句代替。这样也可以解释,为什么子集if语句同if.then.else条件选择语句长得很像,但是作用却完全不一样了……这个扯远了,以后有机会再议……

而if语句是作用在PDV之上的,所有进行计算的变量全部都存在于PDV里。简单一句话,if语句对于其后的变量没有任何限制要求。

说到这里,肯定会有疑问了,如果if语句这么好,为什么不完全用if来代替where呢……正因为where语句作用在PDV前,所以可以极大的提升程序执行的效率。比如原输入数据集有1000万条观测,而只需要对其中满足条件的50条观测进行计算,用where语句进行观测筛选,进入PDV计算的只有50条观测数据。而用if的话,1000万条观测需要都进入PDV后才会开始筛选,效率孰优孰劣,一目了然……
而除去DATA步以外,其他PROC步并没有PDV这种数据结构,所以相应的也就只能使用where不能使用if,或者说不能使用提供筛选观测能力的子集if语句了……

如果简单记忆,不想了解原理,熟记下面这个表的用法就够了……
where.png

另,附上sas论文中关于where和if的解释,还有supersasmacro大神的博客解释。
where vs if------where与if的区别 http://blog.sina.com.cn/s/blog_5d3b177c0100b67o.html
WHERE vs. IF Statements
http://www2.sas.com/proceedings/sugi31/238-31.pdf
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-17 22:47:13
楼上解释得太棒了,很详尽,我要打出来对着看。
拜谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-4-17 22:56:20
再向大佬追问一句,我发现put也只能作用在data步里面,用于调试时临时打印验证下数据值,功能类似万能的python print语句。
那如果我想在proc步里做类似的事,该用啥?这纯粹是因为之前的编程习惯,就喜欢在调试时分段到处打印标记来看程序跑到哪段了,大致结果对不对。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群