2018年8月15日水曜日

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





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



構文

IF  条件式  ;

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





* Sample data ;
data dt1;
input a b;
cards;
1 5
2 6
3 7
4 8
;

例①
data out1;
  set dt1;
  if a = 2;
  c = a + b;
run;




やってる事
  • a = 2 のオブザベーションであれば、以降の処理(変数cを導出)して、out1に出力
  • それ以外はそのオブザベーションに対する処理を中止して、out1に出力しない



例②
data out2;
  set dt1;
  c = a + b;
  if c >= 10;
run;


やってる事
    • データステップ内で変数cを導出
    • c >= 10 のオブザベーションをout2に出力
    • それ以外はそのオブザベーションに対する処理を中止して、out2に出力しない


    データステップ内で導出した変数をサブセット化IFに使用できるのがポイント





    その他サブセット化IFの記事





    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」という文字が含まれている場合に、ログに変数値を出力しています。

        削除