Friday, May 27, 2011

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


一般情况下,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 comments:

 
Copyright 2010 NiuNiu's Warehouse. Powered by Blogger
Blogger Templates created by DeluxeTemplates.net | Blogger Styles | Balance Transfer Credit Cards
Wordpress by Wpthemescreator
Blogger Showcase