ラベル ステートメント: UPDATE の投稿を表示しています。 すべての投稿を表示
ラベル ステートメント: UPDATE の投稿を表示しています。 すべての投稿を表示

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値は重複していないので、見事ルールを満たしてる事になってくれます。
(ようはプログラムとして成立させるためのダミー)


2014年6月23日月曜日

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

UPDATEステートメントの本来の使い方から外れますが、私がよくやる具体例を紹介。
まずサンプル作りから。

*** 患者背景データ ;
data DT1;
length SUBJID $3.;
input SUBJID$ AGE SEX$;
cards;
001 51 F
002 25 M
003 30 F
;
run;
proc sort data=DT1; by SUBJID; run;

 SUBJID  AGE  SEX 
 001 51 F
 002 25  M
 003 30 F

*** 有害事象データ ;
data DT2;
length SUBJID $3. AETERM $20.;
input SUBJID$ AETERM$ ;
cards;
001 発熱
001 不眠
003 腹痛
;
run;
proc sort data=DT2; by SUBJID; run;

 SUBJID 
AETERM 
 001
 発熱    
 001
 不眠 
 003
 腹痛 

DT1は患者ID(SUBJID)毎の年齢(AGE)や性別(SEX)など患者情報が入っているデータです。
DT2は患者ID(SUBJID)毎の治験実施時の有害事象(AETERM)が入っているデータです。

ここで以下のように書くと、、
data OUT3;
   update  DT1 
               DT2 (keep=SUBJID in=X);
   by SUBJID;
   if  X  then AEFLG=1;
run;


 SUBJID  AGE  SEX  AEFLG 
 001 51 F 1
 002 25  M .
 003 30 F 1

有害事象が発現してるかどうかの変数AEFLGを患者背景データに作ることができました。
UPDATEステートメントによって有害事象データがBY値毎に1行にまとまってくれるとこが便利です。

仕組みについては「UPDATEステートメント入門」を参照。
もっと面白いことができるのでまた今度紹介したいと思います。

2014年6月18日水曜日

UPDATEステートメント入門


最近UPDATEステートメントにはまってます。
「データステップ100万回(UPDATEステートメントを使ってみる)」から興味を持ち始めたのですが色々面白いことが出来そうなので、こちらでも基礎から応用例まで紹介したいと思います。


基本構文
data  結果データセット ;
  update  マスターデータ  トランザクションデータ ;
  by   BY変数;
run;


MERGEと似たような動作で、マスターをトランザクションデータで更新します。
異なる点は以下4点で、UPDATEステートメントを使いこなすうえで重要なルールとなります。

① BYステートメントは必須。
② マスター側はBY値が重複するオブザベーションがあったらダメ。
③ トランザクション側はBY値が重複していてもOK。(トランザクション側の値を上から順にマスターへ更新していく)
④ トランザクション側の値が欠損値の場合は更新しない。(MERGEだと欠損値になる)



分かりづらいと思うのでまず以下のサンプルを見てみましょう。

*** マスターデータ作成 **********;
data DT1;
input A B;
cards;
1 1
2 1
3 .
;
run;

*** トランザクションデータ作成 ****;
data DT2;
input A B;
cards;
1 .
2 20
2 30
3 20
4 20
;
run;

*** トランザクションデータを使ってマスターを更新 *****;
data DT3;
   update DT1 DT2;
   by A;
run;


  A    B  
   1    1
   2  30 
   3  20 
   4  20 



具体的には以下のような処理の流れになります。
上の方で説明したUPDATEステートメントのルール①~④と照らし合わせて見てみましょう。