加载中…
个人资料
supersasmacro
supersasmacro
  • 博客等级:
  • 博客积分:0
  • 博客访问:6,212
  • 关注人气:503
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

where vs if------where与if的区别

(2008-11-17 09:25:15)
标签:

if

where

教育

分类: Function函数

where vs if------where与if的区别

原文地址:http://www2.sas.com/proceedings/sugi31/238-31.pdf

转载请注明出处:http://blog.sina.com.cn/s/blog_5d3b177c0100b67o.html

 

一般情况下,if和where是可以相互替换的,但是有些情况下却不能,例如当数据子集包括自动变量或在数据步里新生成的变量时,就必须用if,而不能用where。

我们分析一下if和where应用的条件:

   where <wbr>vs <wbr>if------where与if的区别

从图中我们可以看出,where是在数据进入input buffer前进行处理,而if则是数据进入input buffer之后进行处理,这也是where更快,并且只能用数据集里已有的变量进行条件选择的原因。

下表是if和where的区别的总结,详见《Sharpening Your SAS Skills.》:

 where <wbr>vs <wbr>if------where与if的区别 

例2:

data exam;

  input name $ class $ score ;

  if name = ‘Tim’ or name = ‘Sally’;

  cards;

Tim math 9

Tim history 8  

Tim science 7

Sally math 10

Sally science 7

Sally history 10

John math 8

John history 8

John science 9

;

run;

不能用where的原因是因为这些都是新创建的变量,也可以理解为数据已经在input buffer里了。

 

例5:

data student4;

  set exam;

   * Can use WHERE condition because NAME variable is a data set variable;

  * WHERE condition requires all data set variables;

  where name =: ‘T’ or name contains ‘ally’;  

 run;

下表列举了哪些操作时,必须用where:

 

 

例6:

proc print data = exam;

 where name = ‘Tim’ or name = ‘Sally’;

run;

 

例7:

数据集1:

data school;

input name $ class $ score ;

cards; 

A math 10

B history 10

C science 10

;

run;

 

数据集2:

data school_data;

 input name $ class $ score ;

cards;

A math 10

B history 8

C science 7

;

run;

 

data school_where;     

   merge school school_data;

   by name;        

    * subsets BEFORE merging;

   where score = 10;        

run;    

 

日志:

NOTE: 从数据集 WORK.SCHOOL 读取了 3 个观测。

      WHERE score=10;

NOTE: 从数据集 WORK.SCHOOL_DATA 读取了 1 个观测。

      WHERE score=10;

NOTE: 数据集 WORK.SCHOOL_WHERE 有 3 个观测和 3 个变量。    

 

data school_if;

  merge school school_data;

by name;

  * subsets AFTER merging;

  if score = 10;

run; 

日志:

NOTE: 从数据集 WORK.SCHOOL 读取了 3 个观测。

NOTE: 从数据集 WORK.SCHOOL_DATA 读取了 3 个观测。

NOTE: 数据集 WORK.SCHOOL_IF 有 1 个观测和 3 个变量。

这里因为where是先取子集再合并,因此,当用where时,如日志所述,在school里读到了3个满足条件score=10的观测,在school_data里只读了一条满足条件的观测,然后对这两组读到的数据子集再进行合并,得到日志如述的结果。而当if时,对两个完整的数据集进行合并,于是得到日志所述的结果。因此if跟where差别的原因就是第一张图说述的,where是在数据进入input buffer就对数据进行操作,而if是数据进入input buff以后才对数据进行操作。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有