我整理了一个proc IML代码,它允许从特定数据集中提取数据 - 存储在工作目录中 - 并执行一个简单的等式。然后将结果存储在新数据集中。
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 :(得分:0)
事实上,您可以使用宏观功能轻松完成这样做:
1)设置一个空数据集:
data result;
run;
2)创建宏功能以处理数据集。 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)以下是将多个数据集连接到结果数据集的提示。
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存储到数据集中,以便合并到最终结果数据集中。
最后,您可以将所有值都输入结果数据集。