正直あまりいいオプションとは思えませんが、むしろ反面教師としてTRANSPOSEプロシジャのletの説明

transpsoeプロシジャのletオプションは、ちょっと危ないオプションというか、
絶対にWarningのでるオプションで、はっきり言って僕は絶対使わない方がいいと思うオプションです。
よくわかってない人が全部のtransposeプロシジャの使用箇所にletオプションをつけたせいで、えらいことになって、代わりに書きなおすはめになったことがあるので、個人的に恨みがあります。

どういうことかといいますと、
通常transposeでidステートメントを使用する場合、指定された変数の値に重複があると、転置ができないためエラーになります。これは当然の処置で、本来idに指定する変数は一意に値を定める手がかりにするものなので重複は論外、エラーになるのが正しいのです。

ところがletオプションは、これを強引にWARNINGに格下げして、データセットを最後まで作成します。重複をどのようにして解決するかというと、重複する変数の最後の値のみ採用するという方法で回避します。

例えば以下のようなデータセットがあったとします。

data Q1;
X='A';Y=1;Z=1;output;
X='A';Y=2;Z=2;output;
X='A';Y=3;Z=4;output;
X='A';Y=3;Z=3;output;
X='A';Y=3;Z=3;output;
X='B';Y=1;Z=1;output;
X='B';Y=2;Z=3;output;
X='B';Y=2;Z=2;output;
X='B';Y=3;Z=4;output;
run;













proc transpose data=Q1 out=A1 prefix=Y_;
 var Z;
 id Y;
 by X;
run;


を実行すると









となってデータセットは作成されません。
Yの値が重複してるからです。
例えばX='A'のグループにおいてY_3変数が3つ作られてしまい、SASは同じ変数名をデータセット内
に保持できないのでエラーなのです。

ところが

proc transpose data=Q1 out=A1 prefix=Y_ let;
 var Z;
 id Y;
 by X;
run;












となってERRORからWARNINGにメッセージレベルが変わり、データセットは作成されます。

中身は






です。

いや、まあ便利といってしまえばそうなのかもしれませんが、どうせ重複した値を最後を除いて
消すのなら
transposeに流す前に、nodupkeyとかfirst.last.とかで加工して、一意になる形にしてから
通常の転置をした方がWARNINGもでないし、正道だと思うのです。

どうしても一意にできないデータセットなら、そもそも転置をかけること自体が間違っているか
データ構造に不備があるのではないかと思います。

「このオプションつけるとなんでも転置できて凄い便利ですよ~、でもなんかログが緑になるんですよね~。WARNINGでないようにするオプション知りませんか?」とか言ってたら、ちょっと、その人はヤバイというか、身内なら、全力で叩きなおした方がいいかもしれません。








0 件のコメント:

コメントを投稿