2015年7月16日木曜日

DS2プロシジャ入門6:データの結合

今回はDS2プロシジャでデータセットを結合する方法です。

サンプルデータ
data DT1;
input A B$;
cards;
1 aa
2 bb
3 cc
;

 A 
 B
  1  
  aa 
  2  
  bb  
  3  
  cc  

data DT2;
input A C$;
cards;
1 xx
3 yy
;

 A 
  1  
  xx  
  3  
  yy  



① 縦結合
proc ds2;
  data OUT1 (overwrite=yes);
      method run();
         set DT1 DT2;
      end;
  enddata;
  run;
quit;

 A 
B
C
  1  
  aa 
   
  2  
  bb  
   
  3  
  cc  
   
  1  
   
  xx 
  3  
   
  yy 

SETステートメントはDATAステップと書き方も似てますが、内部の動きや結合結果も同じになるかは不明。
各自色々なパターンでテストしてみた上で利用したほうが良さそうです。


②横結合
proc ds2;
  data OUT2 (overwrite=yes);
      method run();
          set { select coalesce(DT1.A, DT2.A) as A, B ,C
                  from DT1 full join DT2 on DT1.A = DT2.A
                  order by A };
      end;
  enddata;
  run;
quit;

 A 
B
 C 
  1  
  aa 
  xx  
  2  
  bb  
   
  3  
  cc  
  yy 

DS2プロシジャでは、現状MERGEステートメントがありません。
ではどうやってデータの横結合を実現させるかというと、上のようにSETの中でSQL文を書きます。
SQL文なので当然、DATAステップのMERGEステートメントとは挙動が異なります。

これ面白いですよね。基本的にDS2プロシジャではSQLがキーワードになってきます。
通常のデータステップでもこの機能ほしいな~。


(2022/11/06: 追記)
SAS9.4M6から以下のように「DATAステップのMERGE」と似た横結合が出来るようです。
しかし、こちらもDATAステップのMERGEとは挙動が異なるようです。

MERGEステートメント + RETAINオプション
proc ds2;
  data OUT3 (overwrite=yes);
      method run();
          merge DT1 DT2 / retain;
          by A;
      end;
  enddata;
  run;
quit;

4 件のコメント:

  1. third maintenance releaseで一応mergeステートメント追加されたみたいっすね(sas on demandでしかやったことないので確かめられないですが)

    返信削除
  2. マニュアル見たら確かに追加されてました!知らなかったです!
    今SAS ondemandで試してみようと思ったら何故か
    「ERROR: BASE driver, invalid PRIMARYPATH value」
    とかって出てDS2プロシジャ使えなくて試せてないですが、色々試して遊んでみたいと思います。
    有難う御座います!

    返信削除
    返信
    1. 確かそれ、libs=workで通ったはずです。いつ頃からかそれつけないとERRORになる様になった気がします

      削除
    2. おー、動きました!これはSAS ondemandだから出るERRORなんですかね。

      早速DS2のmerge試してみたら、動いてくれて感動です。
      しかも1対多のmergeはデータステップと異なる動きをしてますね。

      削除