2015年5月21日木曜日

論理演算子「^」「^^」によるフラグ変数の作成


データステップ100万回
データステップで0,1のフラグ変数を簡単に作成する

あと、私のブログ記事

の応用なので、まずはリンク先記事をご覧ください。



サンプルデータ作成

data DT1;
  V1="abc"; output;
  V1="def";  output;
  V1="";      output;
run;



論理演算子「^」を利用する。

たとえば、
変数V1に"b"という文字が含まれてたら「0」、含まれてなかったら「1」
という変数を作りたい場合、通常以下のように書くと思います。

if index(V1, "b") > 0 then FLG=0;
else FLG = 1;


これは、以下の2つの書き方でもいけます。


FLG = index(V1,"b")=0;

または

FLG = ^( index(V1,"b") );



2個目の「^( 変数値、式、関数 )」という書き方について。「^」はNOTを表しており、
  • 中の変数値、式、関数の結果を真偽値として評価
  • 「^」で否定しているので、真偽値の結果は逆になります。


つまり、変数値,式の結果,関数の結果が、
  • 0、NULLの場合 ・・・ 「1.true
  • 上記以外 ・・・ 「0.false
となる。



論理演算子「^^」を利用する。

上記の条件を逆にしたい場合、つまり、、
 変数に"b"という文字が含まれてたら「1」、含まれてなかったら「0」としたい場合、以下の2つの書き方でいけます。


FLG2 = index(V1,"b")>0;

または

FLG2 = ^^( index(V1,"b") );



2個目の「^^( 変数値、式、関数 )」という書き方について。「^^」はNOT NOTを表し、
変数値,式の結果,関数の結果などに対して、「否定の否定」をしています。

つまり、変数値,式の結果,関数の結果が
  • 0、NULLの場合 ・・・ 「0.false
  • 上記以外 ・・・ 「1.true
となる。



「^^」を使った応用として、
変数「V1」に"b"という文字が含まれてるかどうかで「1:無」「2:有」という有無変数を作りたい場合、

FLG3 = ^^(index(V1,"b"))+1;


とすれば良い。


注意点

以下のプログラムで出来る「FLG1」と「FLG2」の値は異なる事を理解しておく必要があります。

data DT2;
   A=2;  B=1;

   FLG1 = ^^(A=B);
   FLG2 = ^^A=B;
run;


「FLG = ^^(A=B)」 と書くとAとBが同じ値であれば「1」、それ以外「0」が返されるのに対し、
「FLG = ^^A=B」 と書くと、 「^^A」 の部分が先に評価されて 「FLG = 1=B」 と展開してしまいます。

必要な場合はカッコで括るのを忘れずに!


以上、「色んな書き方があるんだねー」って思ってもらえればいいかなって記事でした。

0 件のコメント:

コメントを投稿