最近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 件のコメント:
コメントを投稿