2014年10月29日水曜日

UPDATEステートメントでオブザベーションをまとめる2


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  
PRO 
 001
 コタツ
 001
 みかん
 001
 トランプ
 002
 みかん
 002
 トランプ 

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;

data DT3;
   update DT2 (obs=0)  DT2 ;
   by NO ;
   keep NO FLG1 FLG2;
run;

 NO  
 FLG1 
 FLG2 
 001
  1
  1
 002
  .
  1


解説


①まずDT2を作るとこんな感じのデータセットができる。
 NO  
PRO 
FLG1 
FLG2 
 001
 コタツ
 1
 .
 001
 みかん
 .
 1
 001
 トランプ
 .
 .
 002
 みかん
 .
 1
 002
 トランプ 
 .
 .
FLG1, FLG2には欠損値か1が入る。


②これを以下のようにまとめたい。
 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 件のコメント:

コメントを投稿