「UPDATEステートメントでオブザベーションをまとめる」とはまた違ったテクニックを紹介。
*** サンプルデータ ; data DT1; length NO PRO $20.; NO="001"; PRO="コタツ"; output; NO="001"; PRO="みかん"; output; NO="001"; PRO="トランプ"; output; NO="002"; PRO="みかん"; output; NO="002"; PRO="トランプ"; output; run; proc sort data=DT1; by NO; run;
NO ・・・ 顧客No
PRO ・・・ 購入商品
|
上のデータから、
コタツまたはみかんを買った顧客を割り出して、以下のようなデータを作りたいとします。
顧客No.
|
コタツ買ったフラグ
|
みかん買ったフラグ
|
---|---|---|
001
|
1
|
1
|
002
|
.
|
1
|
*** UPDATEステートメントで、OBSをまとめる ; data DT2; set DT1; if PRO="コタツ" then FLG1=1; if PRO="みかん" then FLG2=1; run; update DT2 (obs=0) DT2 ; by NO ; keep NO FLG1 FLG2; run;
|
解説
①まずDT2を作るとこんな感じのデータセットができる。
NO
|
PRO
|
FLG1
|
FLG2
|
---|---|---|---|
001
|
コタツ
|
1
|
.
|
001
|
みかん
|
.
|
1
|
001
|
トランプ
|
.
|
.
|
002
|
みかん
|
.
|
1
|
002
|
トランプ
|
.
|
.
|
②これを以下のようにまとめたい。
NO
|
FLG1
|
FLG2
|
---|---|---|
001
|
1
|
1
|
002
|
.
|
1
|
③ここで「UPDATEステートメント入門」を理解すると、
変数値を、欠損値以外の値で更新していくUPDATEステートメントの性質が利用できそうだと気付きます。
以下の構文から、、
update マスターデータセット トランザクションデータセット ; by BY変数; ↓ update マスターデータセット DT2; by NO; |
こんな感じでまずはデータセット名と変数名を当てはめてあげれば良さそうです。
ではマスターデータセットには何を当てはめればよいか。。
マスターデータセットはBY変数NOを持っていて、BY値が重複してたらダメというルールを満たしている必要があるので、、
update DT2(obs=0) DT2 ; by NO; |
と書いてあげればいい。
(obs=0)でオブザベーションを読み込まない、つまりオブザベーションがなければ、少なくともBY値は重複していないので、見事ルールを満たしてる事になってくれます。
(ようはプログラムとして成立させるためのダミー)
0 件のコメント:
コメントを投稿