首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS-IML中的Do循环

SAS-IML中的Do循环
EN

Stack Overflow用户
提问于 2013-07-06 02:07:59
回答 2查看 2.4K关注 0票数 1

我想在proc iml中使用一个宏DO循环,如下所示:

代码语言:javascript
复制
%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作为宏变量。我还尝试了一个普通(非宏)do循环的变通方法,使用substr连接变量名,但也不起作用。这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-07 05:06:09

好的,所以宏应该是:

代码语言:javascript
复制
%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
EN

Stack Overflow用户

发布于 2013-07-07 18:35:06

如果你有SAS/IML 12.1 (与9.3m2一起发布),还有一种更简单的方法。USE statement supports dereferencing data set names,如下所示:

代码语言:javascript
复制
ds = "MyData";
use (ds);

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

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17494653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档