在SAS-IML中循环遍历名称?

时间:2013-07-18 07:04:03

标签: loops sas sas-iml

如何在IML中读取名称为stem + suffix的SAS数据集?词干是作为一个SAS宏变量给出的,我打算使用的就是IML中的字符串向量。

在R中我会使用

suffix<-c('s1','s2')
for (s in suffix){
   data<-eval(as.name(paste(stem,s,sep='')))
}

如果我有第一个数据集的代码,我可以进行循环。我试过了:

proc iml;
suffices = {'s1','s2'};
call symput('suffix',suffices[1]);
use &stem.&suffix.;

问题在于,如果在do循环中(我需要这个,因为我循环遍历名称),调用symput并不能真正起作用。 Here我找到了symget,但在使用环境中,&amp; stem.symget('suffix')并不富有成效。

还有其他想法吗?

编辑:我发现了以下相当不优雅的解决方案:

proc iml;
%global suff;
suffix={'s1','s2','s3'};
%do ii = 1 %to 3;
call symput('suff',suffix[&ii.]);
<do stuff based on the suffix>
%end;

我仍然觉得这不应该是人们的工作方式。

2 个答案:

答案 0 :(得分:1)

我能想到的最简单的方法是使用一些非IML语法。例如,PROC SQL可以生成宏变量列表。

%let stem=class_;
data class_s1 class_s2;
set sashelp.class;
run;

data suffices;
input suffix $;
datalines;
s1
s2
;;;;
run;

%macro use_suffix(suffix=);
use &stem.&suffix.;
read all into &stem.&suffix.;
print &stem.&suffix.;
%mend use_suffix;

proc sql;
select cats('%use_suffix(suffix=',suffix,')') into :suffixlist separated by ' ' from suffices;
quit;

proc iml;
&suffixlist;
quit;

答案 1 :(得分:0)

如果您有SAS / IML 12.1,只需使用字符串连接来构造数据集名称,然后在名称周围加上括号,如博客文章“Read data sets that are specified in an array”中所述。

尝试在循环中使用宏变量时要小心。请参阅文章“Macros and loops in the SAS/IML language

中的提示