2015年5月14日木曜日

DS2プロシジャ入門1:基本構文


SAS9.4から追加されたDS2プロシジャについて、基本的な部分からざっくり解説していきたいと思います。
データステップがパワーアップしたようなプロシジャなので、ある程度データステップの動きを知ってる方が理解しやすいです。

私自身勉強中なので、間違いなどがあればご指摘をお願いします。


基本構文

PROC DS2 ;
     DATA  作成するデータセット ;

         ~ 処理 ~

     ENDDATA ;
     RUN ;
QUIT ;

  PROC DS2;
      ~
  QUIT ;
 DS2プロシジャは、「PROC DS2」で始まり、「QUIT」で終わります。

  DATA データセット ;
      ~
  ENDDATA ;
  RUN ;
 ここは、DATAステップと同じで、 「DATA 」で始まり、「RUN」で締めます。
 ただし、「ENDDATA」も忘れずに。



まずは簡単な例。

例①

*** サンプルデータ作成 *************;
data DT1;
input A @@;
cards;
10 20 30
;
run;

  10 
  20  
  30 

*** DS2 Procedure **********;
proc ds2;
  data _NULL_;

      method init();
          put '--- 出力開始';
      end;

      method run();
          set DT1;
          put '---' A;
      end;
      
      method term();
          put '--- 出力終了';
      end;

  enddata;
  run;
quit;

ログ
--- 出力開始
--- 10
--- 20
--- 30
--- 出力終了

「method init()」 とか 「method run()」 とかいうのが出てきて「なんじゃこりゃ、もうやだ!」って感じですが、ここはグッと堪えましょう。

DS2プロシジャでは、基本的にこのメソッドの中に処理を書いていきます。

  method init() ;
     ~
  end;
 最初に1回だけ実行したい処理をこのメソッドの中に書く。


  method run() ;
     ~
  end;
 各オブザベーションを読み込んで実行したい処理をこのメソッドの中に書く。


  method term() ;
     ~
  end;
 最後に1回だけ実行したい処理をこのメソッドの中に書く。



各メソッドの役割を知ったところで、先ほどのプログラムおよびログと照らし合わせて確認すると、理解がしやすいと思います。


では、もう1歩先に進んだ例を紹介。

例②

*** DS2 Procedure **********;
proc ds2;
   data OUT2 (overwrite=yes);

      keep TOTAL ;  

      method init();
         TOTAL = 0;
      end;

      method run();
         set DT1;
         TOTAL + A;
      end;
 
      method term();
         output;
      end;
 
   enddata;
   run;
quit;

 A 
  60  

ログにWARNINGが出ると思いますが、今は放置しといてください。


解説

method init();
   TOTAL = 0;
end;

まず最初、変数TOTALに、初期値「0」を与えます。

method run();
   set DT1;
   TOTAL + A;
end;

データセットDT1をsetして、変数TOTALに各オブザベーションの変数Aの値を足していきます。

method term();
   output;
end;

最後に1回だけ、output。
これで、変数Aの合計値を求めたデータセットOUT2が出来ました。

以上終わり、、と言いたいところですが、ここで2つ重要なポイント。

data OUT2 (overwrite=yes);

「(overwrite=yes)」 というオプションを入れること!
これは、「すでにOUT2というデータセットが存在する場合、上書きしていいよ」、というオプションです。
つまり、これを指定してないと、上書きできずにエラーになってしまいます。

keep TOTAL ;

データステップの場合だと、keepはどこに書いても問題なかったけど、
DS2プロシジャの場合は、メソッドの外に書かなければいけない。
また、どのメソッドよりも上に書く必要があります。


DS2プロシジャ入門記事

1: 基本構文
: 変数の宣言
3: 変数属性と配列の定義

0 件のコメント:

コメントを投稿