4

SAS データセットの文字列に格納されている SAS コードを読み取る (および実行する) ことは可能ですか。

たとえば、データセット 'CODE' には文字列変数が含まれています。

"IF TOTAL_SALES GE 20000 AND TYPE IN ('A', 'B', 'C') THEN VAR1 = 'Y' ;"

私は何かをすることができますか?

data sales ;
set sales ;
/* run the if statement above */
run ;

SAS 9.2 の使用

4

3 に答える 3

3

これを行う方法は、マクロ変数を作成する方法と同じくらいたくさんあります。通常、最も有用な 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 に関するいくつかの論文を読むことを強くお勧めます

于 2013-07-30T14:43:55.273 に答える