これを行う方法は、マクロ変数を作成する方法と同じくらいたくさんあります。通常、最も有用な 3 つは次のとおりです。
proc sql select into
これにより、多数のコード行を即座に作成でき、おそらくこの目的で使用される最も一般的なツールです。コード行を直接作成することも、より便利にマクロ呼び出しを作成することもできます。たとえば、次のように実行したいとします。
data want;
set have;
x = sum(a,b,c);
run;
ただし、x、a、b、c はすべて別のデータセットで定義されています。さらに、このような3つの変数があります。
data callset;
input var1 $ var2 $ var3 $ var4 $;
datalines;
x a b c
y d e f
z b e c
;;;;
run;
次のように構築できます。
proc sql;
select cats(x,"=sum(",a,",",b,",",c,");") into :calllist
separated by ' '
from callset;
quit;
data want;
set have;
&calllist.
run;
ただし、マクロを作成する方が簡単な場合があります。
%macro sum(var1,var2,var3,var4);
&var1. = sum(&var2.,&var3.,&var4.);
%mend sum;
次に、PROC SQL は少し簡単になります (この場合はそうではありませんが、多くの場合、これはより複雑なコードでの読みやすさに役立ちます)。
proc sql;
select cats('%sum(',catx(',',x,a,b,c),')') into :calllist
separated by ' '
from callset;
quit;
その後、同じように使用します。
ここでの制限: PROC SQL でできることを除いて、作成中に文字列を変更することはできません (これは強力ですが、first.var のようなものを使用する必要がある場合は、別の手順で proc sql を実行します)。マクロ変数には、合計で約 20,000 文字の制限があります。
ところで、これseparated by
は重要です。これがないと、1 行のコードしか作成できません (最後の行のみがマクロ変数に入れられます)。何も区切られたくない場合でも、リストを生成するには ' ' で区切る必要があります。
%include ファイル
インクルード ファイル メソッドは、proc sql メソッドと call execute のハイブリッドです。これはデータ ステップで構築され、OS のファイル サイズ制限を超える長さ制限はありません。ただし、(一時ファイルが作成されるという点で) 少し面倒であり、データラインを含まないなど、インクルード ファイルの通常の制限があります。
次のように作成します (以前のデータセットを使用)。
filename toincl temp; *create temporary fileref;
data _null_;
set callset;
file toincl;
callstr = cats('%sum(',catx(',',x,a,b,c),')');
put callstr $;
run;
data want;
set have;
%include toincl;
run;
これは、PROC SQL の長さの制限を回避しますが、インクルード ファイルの通常の制限があります (詳細については、ドキュメントを参照してください)。
コール実行
これは、データ ステップの直後に対話的にコード行を実行するために使用されます。他の方法よりも柔軟にオンザフライでコードを作成できるので便利ですが、タイミングに大きな制限があります。
data _null_;
set callset; *this is not the main data set, but the control file with SAS code;
call execute('data want; set have;');
callstr=cats('%sum(',catx(',',x,a,b,c),')');
call execute(callstr);
call execute('run;');
run;
人々が通常問題を抱えている主な制限は、マクロ変数のタイミングです。マクロ変数が CALL EXECUTE ステップで定義されている場合、同じ CALL EXECUTE ステップでは使用できません。そのため、コードにマクロ変数を作成して使用するコードが含まれていると、正しく動作しません。他の方法のいずれかを使用する必要があります。この方法を使用する場合は、最初にこれまたはこのような CALL EXECUTE に関するいくつかの論文を読むことを強くお勧めします。