我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

0 obsのデータセットにobsを追加する

テンプレートで空のデータセットを使用することはよくあると思います。

このプログラムで作成されるテンプレートデータセットを使って

data a;
  length a b c 8;
  delete;
run;

f:id:japelin:20210524124132p:plain
こんな結果データセットを作成したいときはどうすればいいでしょうか。


単純に

data b;
  set a;
  a=1;b=2;c=3;
  output;
run;

ではダメです

f:id:japelin:20210524124310p:plain
こんなログが出ちゃいます。


SETステートメントは、ファイル終端を検知した時点で処理を終了する、という動作をします。
そのため、0obsのデータセットを読み込むと、その時点で後続の処理は一切無視して終了します。

ではどうするか。


簡単なのはダミーデータセットをかませる方法です。

data _dummy_;
  a='X';
  output;
run;

data b;
  set a _dummy_(drop=_all_);
  a=1;b=2;c=3;
  output;
run;


通常であれば最初に読み込むデータセットの変数属性が優先されますが、ダミーデータセットのすべての変数をdropしているので、ダミーデータセットの変数名は何でもOKです。
何なら、setステートメントの最初に指定してもOKです。


もし、dataステップで記述する変数がすべて数値変数なら

data b;
  a=1;b=2;c=3;
  output;
  set a;
run;

こんな書き方でもOKです。

setステートメントでデータセットを読み込む前にoutputしちゃうわけです。
ただし、「 a=1;b=2;c=3;」の時点では変数の定義がありませんから、文字変数等の場合は変数長が意図しないものになるため、使えません。あくまでも数値変数限定です。


テンプレートデータセットにDATAステップで手動でデータを埋め込む際には注意しておきたいところです。