2018年8月15日水曜日

【サブセット化IF】条件に一致するオブザベーションのみ処理を継続する。





今回は頻繁に使われる「サブセット化IF」というステートメントについて解説。



構文

IF  条件式  ;

  • データステップ内で使用します。
  • 条件式が成立しない場合、そのオブザベーションに対する残りのプログラムを中止します(そのオブザベーションはデータセットに出力されません)そして即座に次の反復(次のオブザベーションの読み込み)に移行します。
  • 条件式が成立する場合、そのオブザベーションに対する残りのプログラムが実行されます。







* Sample data ;
data dt1;
input sex$ height weight;
cards;
F 160.3 65.2
M 169.7 92.5
F 170.2 59.1
;


例①
data out1;
  set dt1;
  if sex="M";
  bmi = weight / ((height/100)**2);
run;



やってる事
  • sex="M"のオブザベーションであれば、以降の処理(変数bmiを計算)し、out1に出力
  • それ以外は処理を中止し、そのオブザベーションはout1に出力しない




例②
data out2;
  set dt1;
  bmi = weight / ((height/100)**2);
  if bmi>=25;
run;




  • データステップ内でbmiを計算
  • そのbmiが25以上のオブザベーションは、out2に出力
  • それ以外は処理を中止し、そのオブザベーションはout2に出力しない






3 件のコメント:

  1. if 条件で部分一致の式を書きたいのですが、どうすればよろしいでしょうか?
    ifとarrayの式を組み合わせたいのですが・・・・

    返信削除
    返信
    1. 美香さん、コメントありがとうございます!

      ご質問としては以下の2つで合ってますか?

      ①whereのlike演算子のような機能をifに実装させたい
      ②ifで配列を利用したい

      以下にサンプルプログラムを書いてみました。
      やりたい事はこんな感じであってるでしょうか?

      data have;
      input (a b c)(:$50.);
      cards;
      YES NO たぶんYES
      NO YESかも NO
      ;

      data want;
      set have;
      array ar(*) a b c;
      do i=1 to dim(ar);
      if kindex(ar(i),"YES")>0 then do;
      put ar(i);
      end;
      end;
      run;

      ifではlike演算子が使えないので、特定の文字列の位置を返すindex関数(日本語を含む場合はkindex関数)で代用できます。


      不明点や的外れな部分がありましたら、ご指摘頂ければと思います。

      削除
    2. ちなみにサンプルでやっているのは変数A,B,Cに対して「YES」「たぶんYES」のように「YES」という文字が含まれている場合に、ログに変数値を出力しています。

      削除