楼主: 是风啊
26244 26

[学习分享] if和where在SAS中的区别 [推广有奖]

  • 1关注
  • 18粉丝

讲师

12%

还不是VIP/贵宾

-

威望
0
论坛币
2240 个
通用积分
4.0205
学术水平
38 点
热心指数
45 点
信用等级
37 点
经验
362 点
帖子
372
精华
1
在线时间
313 小时
注册时间
2011-9-17
最后登录
2017-11-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
刚才无意中看到一个帖子,说道在SAS中if和where的区别,看后受益颇多啊,所以在此“借帖献佛”啦,哈、、、、、
Question:
              将数据集SASHELP.workers第10到15条观测中满足条件"ELECTRIC>260"的观测提取出来,生成新的数据集tmp。

方法一:
data tmp;
  set SASHELP.workers(firstobs=10 obs=15);
  if ELECTRIC>260;
run;
proc print;
run;


                                 Obs     DATE    ELECTRIC    MASONRY

                                  1     OCT77      278.6      288.7
                                  2     NOV77      276.2      286.2
                                  3     DEC77      274.6      276.7
                                  4     JAN78      262.1      234.3
可见结果输出4条记录;
方法二:
data tmp;
  set SASHELP.workers(firstobs=10 obs=15);
  where ELECTRIC>260;
run;
proc print;
run;


                                 Obs     DATE    ELECTRIC    MASONRY

                                  1     MAY78      278.0      295.5
                                  2     JUN78      289.5      308.3
                                  3     JUL78      296.6      306.9
                                  4     AUG78      305.1      315.3
                                  5     SEP78      307.8      310.6
                                  6     OCT78      308.2      316.3
可见结果输出6条记录。
       问题是上述两种方法为什么输出结果不一样?请注意if语句和where语句的区别
区别:
1. if语句是面向PDV(logical  program  data  vector)的,对当前PDV中的数据进行判断,满足条件时将其写入到外部数据集;where语句也是面向PDV的,它使用于从外部数据源读数据到PDV之前进行判断,当满足条件时才被写入到PDV。显然一个在写入PDV之前,一个在写入PDV之后,两者是有差异的。
2. 当没有数据集选项firstobs=10 obs=15时,if语句和where语句用法结果相同,但有这两个选项时效果就不同了。有这两个选项,if语句是从原数据集(或数据源)的观测记录进行计算个数,即从原数据集的第10号观测开始读入到PDV中,然后再判断是否满足if条件,若满足则输出到外部数据集,直到原数据集的第15号观测结束。而where语句是在读入到PDV之前就进行判断的,所以这里的firstobs的意思是从使得满足where条件的第10个观测开始,而不是原数据集的第10个观测开始。
鉴于问题处理要达到的目的,可见应该采取方法一,

二维码

扫码加我 拉你入群

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

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

关键词:Where HERE whe Electric question where

已有 5 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 2 精彩帖子
superguy333 + 1 + 1 + 1 精彩帖子
双修阁主の + 1 精彩帖子
crackman + 100 鼓励积极发帖讨论
mingfeng07 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 5  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
1033096528 发表于 2013-10-30 15:37:19 |只看作者 |坛友微信交流群
受益良多啊

使用道具

藤椅
slimdell 发表于 2013-10-30 16:34:56 |只看作者 |坛友微信交流群
SUGI 31的proceeding里也有一篇关于where 和if的文章
http://www2.sas.com/proceedings/sugi31/238-31.pdf
Paper 238-31
WHERE vs. IF Statements:
Knowing the Difference in How and When to Apply
Sunil Gupta, Gupta Programming
知乎专栏/微信公号同名:煮酒烹茶读书

使用道具

板凳
slimdell 发表于 2013-10-30 16:37:25 |只看作者 |坛友微信交流群
SUGI30里也有一篇关于if 和where的efficiency的
http://www2.sas.com/proceedings/sugi30/002-30.pdf
Paper 002-30
Efficiency Considerations Using the SAS® System
Rick Langston, SAS Institute Inc., Cary, NC

INTRODUCTION
This paper examines a few of the most common questions regarding efficient SAS code. Its main focus is to
examine CPU usage differences in the areas listed below. Except where noted, all examples were tested on
production versions of SAS on UNIX platforms.
• IF statements versus WHERE statements in DATA steps
• IF statements versus SELECT statements
• PROC SORT versus SQL ORDER BY
• Issues involving DATA step views
• Functions versus arrays versus direct SAS coding
• DATA step stored programs
• Threaded versus non-threaded performance for PROC SUMMARY
• Table lookup comparing PROC FORMAT, merging, and the hash table object
It is important to understand that the real times and CPU times shown in the logs in this paper are not necessarily
indicative of the times you may see if you try the same tests. These times vary greatly between operating systems
and between machine configurations. The times are used here primarily for purposes of comparison to help you to
make decisions on SAS coding practices.
知乎专栏/微信公号同名:煮酒烹茶读书

使用道具

报纸
believe448 在职认证  发表于 2013-10-30 17:03:12 |只看作者 |坛友微信交流群
学习了~

使用道具

地板
妖帝东皇 发表于 2013-10-30 19:25:09 |只看作者 |坛友微信交流群
学习了!
那你是在哪里看到的if和where的帖子的??
┏━━━━━━━━━━━━━━┓
   ☞❤学而无友必然孤陋寡闻!❤
┗━━━━━━━━━━━━━━┛

使用道具

7
barbararan 发表于 2014-2-8 15:43:31 |只看作者 |坛友微信交流群
楼主这里一个问题,
data a;
input id x@@;
cards;
11 10 31 30 41 40
;
data b;
input id y@@;
cards;
11 100 21 200 41 400
;
data whereab;
merge a b;
where id>30;
proc print data=whereab;
run;
data ifab;
merge a b;
if id>30;
proc print data=ifab;
run;


对where 执行结果是
obs id   x   y
  1  41 30 400
  2  41 40   .                       where 语句相当于先将a中的两个观测值31 30,41 40取出,将b中的41 400取出,然后合并, 最终合并结果中看到序号31没了,这个合并对序号进行了怎样的处理啊?????可否解答一二????????????

还有if合并中,应该是现将所有的观测值都放入PDV里,然后挑选,同问对序号进行了怎样的处理???

使用道具

8
barbararan 发表于 2014-2-8 15:45:02 |只看作者 |坛友微信交流群
我突然发现应该直接发帖子求答案比较好啊

使用道具

9
hmjmas 发表于 2014-2-12 12:22:15 |只看作者 |坛友微信交流群
仔细理解一下,有点晕

使用道具

10
applepommefr 发表于 2014-6-12 15:42:54 |只看作者 |坛友微信交流群
太赞了 以前面试的时候遇到这个问题 结果没有答上来

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 20:11