確かに、あなたはこのように簡単にそれを行うには、マクロfonctionを使用することができます。
1)空のデータ・セットを設定します。
data result;
run;
2)データセットを処理するために、マクロfonctionを作成します。 VARマクロ変数は、リストB1、B2、B3、B4のデータセットの番号になります。
%macro processDatasets(var);
proc iml ;
use B&var;
read all var _ALL_ into B&var;
close B&var;
g= B&var.[1,1];
ExG = B&var.[3,1];
Res = B&var.[5,1];
E =2;
R =3;
現在地コールsymputxで値を格納する( "G"、B & VAR。[1,1]、 'G');. グローバルマクロ変数をデータセットto_storeに追加します。
call symputx("g", B&var.[1,1], 'G');.
....
test = g/(g+(ExG/E)+(Res/(R*E)));
print g ExG res test [format = 10.6];
create try var {g ExG res test};
append;
close try;
run; quit;
ここでは、マクロ変数を現在のデータセットに格納する方法を示します。
data to_store;
g=call symget("g");
ExG=call symget("ExG");
...
run;
3)ここでは、複数のデータセットを結果の1つに連結するヒントを示します。
data result;
set result to_store;
run;
%mend processDataset;
4)あなたは、関数に複数の呼び出しを行うことができます。
%processDataset(1);
%processDataset(2);
%processDataset(3);
...
5)または番号のリストを、あなたのことができループ:
%macro processVarList;
%let var_list=1|2|3|4;
%let k=1;
%do %while (%qscan(&var_list, &k,|) ne);
%let VAR = %scan(&var_list, &k,|);
%processDataset(&var);
%let k = %eval(&k + 1);
%end;
%mend processVarList;
%processVarList;
6)あなたはこれを適応させることができます結果データセットに格納するコードに従います。 私はコードをテストしませんでしたが、そのアイデアはそこにあります。 最終結果データセットにマージするには、変数G、ExG、Res、E、Rをすべてデータセットに保存する必要があります。
最終的には、結果データセットにすべての価値をもたらします。
IMLを使用する理由はありますか?各テーブルから3つのスカラー値を使用しているようですが、マトリックス言語を使用する理由は不明です。マクロを使用して任意のテキストを生成できるので、IMLコードを簡単に生成できます。しかし、私は、あなたが望むなら、IML自体を代わりにコードを生成するために使うことができると信じています。 – Tom
リンクされた複製は "データステップ"ですが、コンセプトはまだIMLに広く適用されます。その質問/回答を見て、あなたの問題をそれに適応させるのに問題がある場合は、新しい質問をすることを検討してください。マクロを作成することについては、最初にマクロを作成する方法については、自分自身でいくつかの調査を行いたいと思うでしょう。ここではあまりにも広い質問です。 – Joe
@Tom:コードと良い説明に感謝します。それは完全に動作します。基本的に私はIMLを使ってデータを抽出して計算を実行するのが最も簡単な方法でしたし、より複雑なタスクを簡単に拡張できると思います。 – user3570605