2015年4月10日金曜日

「FIRST.BY変数」と「LAST.BY変数」で、グループ毎の最初と最後のオブザベーションを特定する。




SASの基本的な機能でよく使われる、一時変数 「FIRST.BY変数」「LAST.BY変数」 を解説したいと思います。


まずは例をご覧ください。

*** サンプルデータ作成 ;
data DT1;
  input A$ B C;
cards;
001 1 1
001 1 2
001 2 1
001 2 2
002 1 1
002 1 2
002 2 1
002 2 2
;











*** 変数Aの値毎に、最初と最後のオブザベーションにフラグを立てる ;
proc sort data=DT1;
   by A B C;
run;

data DT2;
   set DT1;
   by A B C;

   length FLG1 FLG2 $1.;
   if  first.A = 1 then FLG1 = "Y";
   if  last.A = 1 then FLG2 = "Y";
run;



解説

データステップ内にBYステートメントが書いてあると、「FIRST.BY変数」と「LAST.BY変数」という一時変数が利用可能になります。

今回の例では、BYステートメントで

   by A B C;

と書くと、BY変数A, B, C に対応する以下の一時変数が利用可能になります。

「first.A」, 「last.A」
「first.B」, 「last.B」
「first.C」, 「last.C」

これらの一時変数について、以下にイメージを示します。


①「first.A」 「last.A」のイメージ














②「first.B」 「last.B」のイメージ














③「first.C」 「last.C」のイメージ





📝注意

  • 一時変数なので、データステップ内でしか存在しません(データセット化した時にはなくなってます)
  • あと、みなまで言うなって感じかもですが、BYステートメントで指定した変数の順に、あらかじめソートされている必要があります。
  • 今回の機能は「サブセット化IF」と一緒に使用すると正しく動かなくなりやすいです(解説記事:「サブセット化IFでありがちな落とし穴」)


0 件のコメント:

コメントを投稿