サブセット化IFステートメントとWHEREステートメントの違い

[OS]ALL
[リリース] 6.07以降
[キーワード] base, datastep, where, if, statement, usage, subset, data

[質問]

サブセット化IFステートメントとWHEREステートメントは非常によく似ています。
どう使い分ければよいか教えてください。

[回答]

サブセット化IFステートメントとWHEREステートメントは、どちらも条件にもとづいてオブザベーションを選択するのに使えます。また構文もよく似ています。
しかしこれらのステートメントは、次の点で異なっています。

  • オブザベーション選択のタイミング
  • 記述できる条件式
  • 使用できるステップ
●オブザベーション選択のタイミング
SAS System 6のSASでは、エンジンと呼ばれる入出力用プログラムがSASデータセットのアクセスに使われます。
オブザベーションを読み込む場合、まずエンジンがSASデータセットから読み込み、そのオブザベーションがDATAステップ等に引き渡されます。
WHEREステートメントはエンジンでの読み込みの際に作用します。一方サブセット化IFステートメントはDATAステップでの処理の際に作用します。 この違いにより、実際に次のような相違点が生じます。
  • 外部ファイルからの読み込みにはエンジンは使われません。このためWHEREステートメントは、INFILE-INPUTで読み込む外部ファイルには使用できません。
  • グループ処理を行うときに使用するFIRST.byおよびLAST.by変数の値の挙動が、WHEREステートメントとサブセット化IFステートメントでは異なることがあります。

●記述できる条件式
サブセット化IFステートメントでは、SAS演算式のルールにもとづく任意の条件式が使えます。
一方WHEREステートメントはエンジンでの処理時に作用するため、条件式にDATAステップ関数は使えません。 しかしWHEREステートメント特有の便利な各種演算子(CONTAINS、BETWEEN-AND、LIKEなど)が使えます。
  • 変数NAMEに"John"が含まれていてAGEが20以下のオブザベーションを選択するWHEREステートメントは、次のように記述できます。
    	      where name contains "John" and age <= 20;
    	      
  • サブセット化IFステートメントでは、同じ条件式を表すのにINDEX関数を使用します。
    	      if index(name,"John") and age <= 20;
    	      

●使用できるステップ
サブセット化IFステートメントはDATAステップでしか使えません。
一方WHEREステートメントはエンジンでの処理時に作用するため、DATAステップだけでなくPROCステップでも使えます。

SASデータセットの一部に対してプロシジャで処理する場合、SAS System 5では、まずDATAステップでサブセットのデータセットを作成し、 次にプロシジャを実行する必要がありました。
SAS System 6では、PROCステップでWHEREステートメントが使えるので、1つのPROCステップで簡単にデータのサブセットを処理できます。 これは、CPU時間およびディスク容量の節約になります。

  • 変数SEXの値が"F"のオブザベーションについて散布図を作るには、WHEREステートメントを使えばPROCステップだけで処理できます。
    	      proc plot data=sasuser.class;
    	         plot weight * height;
    	         where sex="F";
    	      run;
    	      
  • サブセット化IFステートメントを使う場合、DATAステップとPROCステップの2つのステップが必要です。
    	      data female;
    	         set sasuser.class;
    	         if sex="F";
    	      run;
    
    	      proc plot data=female;
    	         plot weight * height;
    	      run;