2018年1月19日金曜日

HASHオブジェクトで、Key変数毎に最小値・最大値・合計値などを取得する方法【DO_OVER編】




ちょっと前に以下の記事を書きました。
HASHオブジェクトで、Key変数毎に最小値・最大値・合計値などを取得する方法



で、マニュアルをよくよく見ると、SAS9.4から追加になった 「DO_OVERメソッド」を使えばもっと楽に書けたんですね。勉強不足すぎ・・

データステップ100万回でも取り上げられてて、そういえばこの記事読んだとき「おー!!」と思った記憶があった。いつこの感動を忘れてしまったんだろう・・
ハッシュオブジェクト感動物語(おまけ付き)



とういわけで、前書いた記事の訂正、というか追記です。
なので、サンプルデータの作成部分とか諸々の説明などは前書いた記事を参照下さい。


以下が訂正したプログラム

data OUT;

    set DT1;

    /* 購入データをHashオブジェクトに格納 */
    if _n_=1 then do;

        length BUYDATE 8.;
        call missing( BUYDATE );

        dcl hash buy( dataset:"DT2", multidata:"y" );
        buy.definekey("NO");
        buy.definedata("BUYDATE");
        buy.definedone();

    end;


    /* Hashオブジェクト内をループして、顧客IDごとの購入日の最小値を取得 */
     do while ( buy.do_over()=0 );
          MINDATE = min( MINDATE, BUYDATE );
     end;

     format MINDATE yymmdd10.;
     keep NO SEX AGE MINDATE;
run;

かなりシンプルになりました!


「DO_OVERメソッド」は、「FINDメソッド」「FIND_NEXTメソッド」を組み合わせたようなやつです。
このメソッドを使う場合は一応マニュアルも見といた方がいいです。

(do whileのループの途中で検索するKey値を変えるような場合は、Hashオブジェクト内の検索位置を先頭に戻すために「RESET_DUPメソッド」を使う必要があったり、などよく動きを理解する必要があるので)


📝注意

記事の中で使用している「_N_」は「サブセット化IF」と一緒に使用すると正しく動かなくなりやすいです。

0 件のコメント:

コメントを投稿