【问题标题】:How to perform same SAS procedure over multiple datasets [duplicate]如何在多个数据集上执行相同的 SAS 过程 [重复]
【发布时间】:2018-05-14 11:48:55
【问题描述】:

我整理了一个 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 宏,但我在这方面的知识非常有限。我将不胜感激。

【问题讨论】:

  • 您为此使用 IML 是否有原因?看起来您只是使用每个表中的三个标量值,所以不确定为什么要使用矩阵语言。您可以使用宏生成您想要的任何文本,因此可以轻松生成 IML 代码。但我相信,如果您愿意,可以使用 IML 本身来生成代码。
  • 虽然链接的副本是“数据步骤”,但这些概念仍然广泛适用于 IML。看看那个问题/答案,如果你在调整你的问题时遇到问题,可以考虑提出一个新问题。就首先制作宏而言,您需要自己研究如何做到这一点,这里的问题太宽泛了。
  • @Tom:非常感谢代码和良好的解释。它完美地工作。基本上我使用 IML,因为它是提取数据和执行计算的最简单方法,而且我认为它可以轻松扩展到更复杂的任务。
  • @Joe:感谢您提供指向类似问题的链接。我很高兴每一条建议都能提高我的技能。我使用带有 %let 和 %do 步骤的 proc SQL 组合了一个宏,以从单个数据集中提取列/变量,并逐步为所有列/变量执行一个过程。但是,我很难应用 proc SQL 从单独的数据文件中提取信息,然后应用该过程。我会调查的。

标签: loops macros sas dataset sas-iml


【解决方案1】:

确实,您可以像这样使用宏函数轻松完成:

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 存储到数据集中才能合并到最终结果数据集中。

最后,您将所有价值都放入结果数据集中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多