2017-11-30 32 views
0

作業ディレクトリに格納された特定のデータセットからデータを抽出し、簡単な方程式を実行できるproc IMLコードをまとめました。結果は新しいデータセットに保存されます。複数のデータセットで同じSAS手順を実行する方法

proc iml ; 
use B1; 
read all var _ALL_ into B1; 
close B1; 

g= B1[1,1]; 
ExG = B1[3,1]; 
Res = B1[5,1]; 
E =2; 
R =3; 

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; 

私は今、私のSAS作業フォルダに保存されている複数のデータセットには、この手順を適用し、新しいフォルダに組み合わせた結果を追加したいと思います。データセットはB1、B2、B3としてコード化されています... 私は、ループ機能を備えたSASマクロが必要だと思っていますが、この分野の知識は非常に限られています。助けていただければ幸いです。

+0

IMLを使用する理由はありますか?各テーブルから3つのスカラー値を使用しているようですが、マトリックス言語を使用する理由は不明です。マクロを使用して任意のテキストを生成できるので、IMLコードを簡単に生成できます。しかし、私は、あなたが望むなら、IML自体を代わりにコードを生成するために使うことができると信じています。 – Tom

+0

リンクされた複製は "データステップ"ですが、コンセプトはまだIMLに広く適用されます。その質問/回答を見て、あなたの問題をそれに適応させるのに問題がある場合は、新しい質問をすることを検討してください。マクロを作成することについては、最初にマクロを作成する方法については、自分自身でいくつかの調査を行いたいと思うでしょう。ここではあまりにも広い質問です。 – Joe

+0

@Tom:コードと良い説明に感謝します。それは完全に動作します。基本的に私はIMLを使ってデータを抽出して計算を実行するのが最も簡単な方法でしたし、より複雑なタスクを簡単に拡張できると思います。 – user3570605

答えて

0

確かに、あなたはこのように簡単にそれを行うには、マクロ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をすべてデータセットに保存する必要があります。

最終的には、結果データセットにすべての価値をもたらします。

関連する問題