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 では、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