Kengo Nagashima



データの追加 (APPEND procedure)

APPEND procedure は同一変数を持つ SAS データセットを縦方向に結合するためのプロシージャです。DATA step の SET statement でもよいですが、追加元のデータセットが空の場合はエラーが出てしまいます。

proc datasets lib = work;
  delete base;
data append;
  x = 1;
data result;
  set base append;
run;
5   data result;
6     set base append;
ERROR: ファイル WORK.BASE.DATA は存在しません。
7   run;

APPEND procedure では、追加元のデータセットが空の場合、追加したいデータセットのコピーを行ってくれます。従って、シミュレーションを行った際に、結果を一つのデータセットに縦積みしていく処理などに利用できます。以下では、利用例などについて説明していきます。

APPEND procedure の構文

APPEND procedure では、base オプションに追加元のデータセット、data オプションに追加したいデータセットを指定します。さらに、force オプションを入れた場合は、異なる変数が含まれていた場合にも強制的に結合します (追加元のデータセットに含まれない変数は削除される)。

proc append base = base data = append force;
run;
1   proc append base = base data = append force;
2   run;

NOTE: WORK.APPEND を WORK.BASE に追加します。
NOTE: BASE データセットが存在しません。 DATA ファイルを BASE ファイルにコピーします。

シミュレーション中での利用

一般的なシミュレーションでは条件を複数設定し、各条件下における性能を計算して求める処理を行うと思います。以下は APPEND procedure を用いてシミュレーション結果をまとめる例です。

%macro dosim(base, condition1, condition2, condition3, seed);
/*
  Simulations Code
*/
data result;
  call streaminit(seed);
  performance = rand("Uniform");
data append;
  condition1 = &condition1.;
  condition2 = &condition2.;
  condition3 = &condition3.;
  set result;
proc append base = &base. data = append;
run;
%mend dosim;

proc datasets lib = work;
  delete base;
%dosim(base, 1, 1, 1, 469179);
%dosim(base, 2, 1, 1, 607482);
%dosim(base, 2, 2, 1, 556749);
%dosim(base, 2, 2, 2, 044613);
%dosim(base, 1, 2, 1, 198887);
%dosim(base, 1, 2, 2, 585903);
%dosim(base, 1, 1, 2, 194036);
proc print data = base;
run;

5–7 行目の data result; ... は、本来 Simulations Code 中で作られる結果の格納されたデータセットですが、今回は適当な値を生成して格納しています。
APPEND procedure を用いる事で、条件分岐や初期化の手間が減るため、スマートなコードが記述できるようになります。

実行結果は以下の様になります。

condition1    condition2    condition3    performance

     1             1             1          0.70077
     2             1             1          0.15010
     2             2             1          0.25914
     2             2             2          0.93130
     1             2             1          0.36554
     1             2             2          0.86424
     1             1             2          0.98641

履歴