自分用メモ-DS2 ①libs= やmergeとか

最近DS2をいじくっています。これは自分用の覚書で、発見したことを脈絡なくあげていきます。(説明書読まずに使って覚えるタイプなので)
高確率で間違えるので、つっこんでください

ちゃんと勉強したい人はSAS忘備録の連載読んでください
http://sas-boubi.blogspot.jp/search/label/%5B%E2%96%BC%20DS2%E3%83%97%E3%83%AD%E3%82%B7%E3%82%B8%E3%83%A3%E5%85%A5%E9%96%80


①sas on demand特有なのかは知らないが最近のメンテナンスリリース後に
proc ds2;ではエラーになる proc ds2 libs=work;とどのライブラリの中で動かすのかを明示する必要があるらしい

以前は通ってたコードも以下みたいなエラーがでた。
 ERROR: BASE driver, invalid PRIMARYPATH value, /home/sasyamasasyama0/Data
 ERROR: BASE driver, cannot assign library/path
 ERROR: TKTS initialization failed.

② 次のコードのようにDS2でデータセット作成後に、data=を省略したprocを書くと

proc ds2 libs=work;
   data _DT1 (overwrite=yes);

       dcl char(10) VAR1;

       method run();
           dcl char(10) VAR2;
       end;

   enddata;
   run;
quit;

proc print;run;






とするとproc printがこける。つまりDS2で作成したデータセットは_LAST_に保持されないということのようです。sqlプロシジャと同じ感覚でいると痛い目見るらしい。

③9.4メンテナンスレベル3からmergeステートメントが実装されたが、amatsuさん指摘のとおり、多と1のマージ結果がデータステップのmergeステートメントと違う。

SAS忘備録 DS2プロシジャ入門6:データの結合
http://sas-boubi.blogspot.jp/2015/07/ds26.html

data A;
ID=1;x=1;y=2;output;
ID=1;x=1;y=2;output;
ID=2;x=1;y=2;output;
run;
title "データセットA";
proc print;run;

data B;
ID=1;x=2;z=1;output;
ID=2;x=3;z=2;output;
ID=3;x=4;z=3;output;
run;
title "データセットB";
proc print;run;

data M1;
    merge A B;
    by ID;
run;
title "元祖mergeステートメント";
proc print data=M1;run;

proc ds2 libs=work;
    data D1(overwrite=yes);
       method run();
          merge A B;
        by ID;
       end;
     enddata;
    run;
quit;
title "DS2のmergeステートメント";
proc print data=D1;run;










































1の方のみの変数の値の引き延ばしが起きないのか。まるで罠のような仕様だ。
ds2内でのマージはsqlのjoinでやるようにコーディングルール作った方がいいのでは?本末転倒だ。


0 件のコメント:

コメントを投稿