【问题标题】:Do-loop in SAS-IMLSAS-IML 中的循环
【发布时间】:2013-07-05 18:07:58
【问题描述】:

我想在 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-loop。 我无法弄清楚为什么循环不能将 &Tab&i 视为宏变量。 我还尝试了使用 substr 连接变量名称的普通(非宏)do-loop 的解决方法,但它也不起作用。我在这里想念什么?

【问题讨论】:

  • 制表符上的双符号...我是个白痴。
  • 太棒了!请提交您的解决方案作为答案并接受它。这绝对是一个非常常见的错误,值得作为 StackOverflow 中的解决方案 :)

标签: matrix sas sas-macro do-loops sas-iml


【解决方案1】:

好的,所以宏应该是:

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

Tab 上的第二个符号是必要的,因为没有它,宏处理器会尝试将 &Tab 解释为宏变量(不存在)。因此,当尝试连接多个宏变量以创建一个新变量时,请使用 &&。

【讨论】:

    【解决方案2】:

    如果您有 SAS/IML 12.1(随 9.3m2 发布),还有更简单的方法。 USE statement supports dereferencing data set names, 是这样的:

    ds = "MyData";
    use (ds);
    

    此外,正如我在article on using the VALSET function 中所展示的,SAS/IML 语言支持 VALSET 函数,该函数可以动态创建名为 Mat1、Mat2 等的矩阵。 您可以结合这些功能来完全消除宏:

    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;
    

    【讨论】:

    • 摆脱宏也是我的目标。我想你可以用你的解决方案写call valset("Mat"+strip(char(i)));,让它更整洁。不幸的是,我仍在使用 9.2。据我了解,此解决方案不适用于此版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多