SASデータセット [MASTER] と [TRAN] には共通の変数KEYとNUMがあります。[TRAN] の内容で [MASTER] を更新したいのですが、[MASTER] にはKEY変数が同じオベザベーションが複数存在するためUPDATEステートメントは使えません。
そこで、MERGEステートメントを使いましたが、各KEY変数の2番目以降のオブザベーションは更新されず、元の値のままになってしまいます。
どうすればよいでしょうか。
[MASTER] [TRAN] [希望の結果] [実際の結果]
KEY NUM KEY NUM KEY NUM KEY NUM
A 1 A 100 A 100 A 100
A 2 B 200 ==> A 100 A 2
B 1 B 200 B 200
B 2 B 200 B 2
C 1 C 1 C 1
まず、うまく更新できない理由から説明します。次のプログラムを実行すると [実際の結果] が得られます。
data wrong;
merge MASTER TRAN;
by key;
run;
第1オブザベーションの処理時は、まず[MASTER]のオブザベーション、次に[TRAN]のオブザベーションが読み込まれます。 この順序で読み込まれるため、NUMの値は100となります。 第2オブザベーションの処理を開始したときは、DATAステップの次のルールによって、NUMの値は100のままです。
[MERGE/BYステートメントを組み合わせて読み込むSASデータセット中の変数値は、BYグループが変るとき以外は初期化されない。]
ところが、第2オブザベーションの処理に入ると、MASTER の第2オブザベーションだけが読み込まれ、NUM の値は2になってしまいます。
さて、上のルールを理解すれば、[いったん別の変数として読み込めばよい] ということに気がつきます。次のプログラムを見てください。
data correct;
merge MASTER TRAN(rename=(NUM=NUM2));
by key;
drop NUM2;
if NUM2 ne . then NUM=NUM2;
run;
このプログラムでは、[TRAN] の変数 NUM を変数 NUM2 として読み込んでいます。変数 NUM2 は各グループの先頭で読み込まれ、グループの処理中はその値を維持します。
また、[MASTER] のデータCのように、読み込めるオブザベーションがないときは、その値は欠損値となります。そこで、変数NUM2 が欠損値でないときにだけ値を変数 NUM にコピーすれば、期待する処理結果が得られます。変数NUM2の値の動きを実際に確認する場合は、DROPステートメントを削除して実行してください。
Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.
If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website.
コミュニティの基本的なガイドラインについてご説明します。まずは、こちらをご参照ください。
SAS Support CommunitiesのFAQはヘルプに記載されています。参照方法は、こちらからご確認ください。
Japan SAS Discussionページに質問や意見(メッセージ)を投稿/返信する方法を簡単にご説明します。