データステップ100万回
「データステップで0,1のフラグ変数を簡単に作成する」
サンプルデータ作成
論理演算子「^」を利用する。
たとえば、
変数V1に"b"という文字が含まれてたら「0」、含まれてなかったら「1」
という変数を作りたい場合、通常以下のように書くと思います。
これは、以下の2つの書き方でもいけます。
2個目の「^( 変数値、式、関数 )」という書き方について。「^」はNOTを表しており、
たとえば、
変数V1に"b"という文字が含まれてたら「0」、含まれてなかったら「1」
という変数を作りたい場合、通常以下のように書くと思います。
if index(V1, "b") > 0 then FLG=0; else FLG = 1; |
これは、以下の2つの書き方でもいけます。
2個目の「^( 変数値、式、関数 )」という書き方について。「^」はNOTを表しており、
- 中の変数値、式、関数の結果を真偽値として評価
- 「^」で否定しているので、真偽値の結果は逆になります。
つまり、変数値,式の結果,関数の結果が、
- 0、NULLの場合 ・・・ 「1.true」
- 上記以外 ・・・ 「0.false」
上記の条件を逆にしたい場合、つまり、、
変数に"b"という文字が含まれてたら「1」、含まれてなかったら「0」としたい場合、以下の2つの書き方でいけます。
2個目の「^^( 変数値、式、関数 )」という書き方について。「^^」はNOT NOTを表し、
変数値,式の結果,関数の結果などに対して、「否定の否定」をしています。
つまり、変数値,式の結果,関数の結果が
- 0、NULLの場合 ・・・ 「0.false」
- 上記以外 ・・・ 「1.true」
となる。
「^^」を使った応用として、
変数「V1」に"b"という文字が含まれてるかどうかで「1:無」「2:有」という有無変数を作りたい場合、
とすれば良い。
注意点
以下のプログラムで出来る「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」 と展開してしまいます。
「FLG = ^^A=B」 と書くと、 「^^A」 の部分が先に評価されて 「FLG = 1=B」 と展開してしまいます。
必要な場合はカッコで括るのを忘れずに!
以上、「色んな書き方があるんだねー」って思ってもらえればいいかなって記事でした。
0 件のコメント:
コメントを投稿