2020年5月5日火曜日

【SETステートメント】データセットを縦結合する






DATAステップの「SETステートメント」で複数のデータセットを縦に結合することができます。





構文

DATA     出力データセット;
    SET    データセット1   データセット2 ・・・;
RUN;

  • 「SET」に結合したいデータセットを列挙
  • 「DATA」に結合後に作成するデータセット名を指定




Sample data

data DT1;
input X Y:$2. Z;
cards;
1 aa 10
2 bb 20
;
data DT2;
input X Y:$1.;
cards;
3 c
4 d
;
XYZ
1aa10
2bb20
XY
3c
4d




例1. SETに1つだけデータセットを指定した場合

data OUT1;
    set DT1;
run;
XYZ
1aa10
2bb20

  • SETに指定されたデータセットと同じ中身のデータセットが作成されます。



例2. SETに複数のデータセットを指定した場合

data OUT2;
    set DT1 DT2;
run;
XYZ
1aa10
2bb20
3c.
4d.

  • SETに指定されたデータセットの順に縦結合されます。
  • SETに指定されたデータセット間で
    • 共通する変数名同士を縦に結合し
    • 片方にしかない変数も残してくれます。



例3. 失敗例

data OUT3;
    set DT2 DT1;
run;
XYZ
3c.
4d.
1a10
2b20

ログ
WARNING: 入力データセットによって、変数Yに複数の長さが指定されています。
 データの切り捨ての原因になります。


  • なんかログに WARNING が出ちゃったし、
  • 結合元の DT1 の1行目の Y が「aa」だったのが、結合後「a」になっちゃってる
  • 結合元の DT1 の2行目の Y が「bb」だったのが、結合後「b」になっちゃってる 


これは以下の重要な性質によるものです
  • SETに指定された最初のデータセットの LENGTH が適用される


今回の例では、変数Y のLENGTHは
  • DT2・・・「1」
  • DT1・・・「2」


そして、SETに指定された最初のデータセットは「DT2」なので、結合後の 変数Y のLENGTHは「1」に設定されてしまい、文字切れが起きたというわけですね。



解決策
data OUT4;
    length Y $2.;
    set DT2 DT1;
run;
XYZ
3c.
4d.
1aa10
2bb20

  • SETの前に「LENGTHステートメント」でLENGTHを再設定してあげればOK



SETステートメントの落とし穴


SASに慣れてきたかたでも、わりと陥りやすい落とし穴。
以下も参考まで(わりと上級者向けの内容ではあるかもです・・)
SETステートメントの落とし穴