ラベル 演算子: IN の投稿を表示しています。 すべての投稿を表示
ラベル 演算子: IN の投稿を表示しています。 すべての投稿を表示

2016年4月21日木曜日

INオペレータは 「X in (A B C)」 のようにカンマが無くてもOK


以下をご覧ください。

data DT1;
   set SASHELP.CLASS;
   where AGE in (13, 14, 15);
run;

「AGEが13, 14, 15のいずれか」 という条件になります。
この書き方は以下のようにカンマを入れなくても動きます。

data DT1;
   set SASHELP.CLASS;
   where AGE in (13 14 15);
run;



カンマを入れない方がプログラムがスッキリして見える気がします。
あと役にたつ例として、単純な例ですが以下のようなマクロがあったとします。

%macro TEST( IN );

   proc means data=SASHELP.CLASS;
       var AGE;
       where AGE in (&IN);
   run;

%mend;


「where AGE in (&IN)」 で INの中身をマクロ変数として指定するようにしています。
「where AGE in (13,14,15)」と展開したい場合、以下のように%STR関数を使ってカンマをクオートする必要がありますが、、
%TEST(%str(13,14,15));



カンマを省略すれば以下のような単純な書き方で済みます。
%TEST(13 14 15);



必要に応じて使い分けてみましょう。

2014年1月21日火曜日

条件式(IF/WHERE)におけるINオペレータの小技




以下のようなデータセットがあったとする。

data DT1;
    do V=1 to 6 ;
        output;
    end;
run;



そこから、変数「V」が「1, 3, 4, 5」のどれかだったら、
レコードを抽出したり何らかの処理を行いたい場合、以下のように書くことが出来ます。

data DT2;
    set DT1;
    if  V in (1, 3, 4, 5) ;
run;



さらに「コロン」を使うと便利です。
「3 : 5」とコロンを挟むことで、「3~5の整数」と範囲指定することができます。

data DT2;
  set DT1;
  if  V in (1, 3 : 5) ;
run;


IFじゃなくて WHERE V in (1, 3 : 5);
とWHEREに置き換えて実行すると、どのような内部処理が行われてるかログに表示されます。

それによると 「WHERE  (V=1)  or  ( (V=INT(V))  and  (V>=3 and V<=5) ) ;
みたいな長ったらしい文に置き換えて内部処理してることが分かります。

「1または3~5の整数」 という条件になってますね。



注意

コロンによる指定は整数限定(「0.1 : 0.5」みたいな小数指定は無理)。