1

次のように、proc iml 内でマクロ do ループを使用したい:

%Let Tab1=FirstTable;
%Let Tab2=SecondTable;
%Let Tab3=ThirdTable;

*&Tab1-3 have been initialised as sas datasets;   

proc iml;

* This works;

use &Tab1;
read all into Mat3;
print Mat3;


* This doesn't work;

%Macro Define_mx;
    %do i=1 %to 2;
    use &Tab&i;
    read all into Mat&i ;
   %end;
  %Mend Define_mx;
%Define_mx;

*The two matrixes have not been initialised;

print Mat1;
print Mat2;
quit;

実際には、50 個のマトリックスを初期化する必要があるため、do ループが必要です。ループが &Tab&i をマクロ変数として認識できない理由がわかりません。また、substr を使用して変数名を連結する通常の (マクロではない) do ループで回避策を試みましたが、どちらも機能しませんでした。ここで何が欠けていますか?

4

2 に答える 2

1

SAS/IML 12.1 (9.3m2 でリリース) を使用している場合は、さらに簡単な方法があります。USE ステートメントは、次のように、データ セット名の逆参照をサポートしています

ds = "MyData";
use (ds);

さらに、VALSET 関数の使用に関する私の記事で示したように、SAS/IML 言語は、Mat1、Mat2 などの名前の行列を動的に作成できる VALSET 関数をサポートしています。これらの機能を組み合わせて、マクロを完全に排除できます。

data a b c;                 /* create sample data sets */
x=1;y=2; output;
x=2;y=3; output;
run;

proc iml;
dsnames = {a b c};          /* names of data sets */
do i = 1 to ncol(dsnames);
   use (dsnames[i]);        /* open each data set */
   read all into X;
   close (dsname);
   MatName = "Mat"+strip(char(i)); /* create Mat1, Mat2,... */
   call valset(MatName, X);        /* assign values from data set */
end;
show names;
于 2013-07-07T10:35:06.340 に答える