我完全不熟悉SAS中的宏/执行循环/数组,但是我一直在尝试阅读它们。进展不顺利。
我有一个包含148,176行,9列的数据集。我想通过我的程序一个接一个地运行所有148176个组合(因此,每一行一个接一个),并将其作为一个长列表吐出。最后我应该有148176个值。
在使用宏块之前,我只使用了宏变量,以便用户可以输入每个值,如下所示:
%let classIin = 1;
%let classIIin = 0.8;
现在,我想用9列中的变量替换上述%let语句中的每个数字(每列将对应于上述宏变量之一,有9个我没有全部列出)。
我开始尝试编写这段代码,但是我真的很困惑,而且我知道我缺少有关此过程的关键信息。如果有人有我应该看的有用的视频教程,我很乐意这样做,因为到目前为止,我发现没有任何帮助。
以下,“ AA”和“ AB”是Work.MasterPlanList中的两个列名,但是我不确定是否可以用这种方式调用变量。
%macro masterlist;
%do i=1 %to 148176;
Data Work.test;
Set work.MasterPlanList(firstobs=&i obs=&i);
call symputx ('classIin', AA)
call symputx ('classIIin', AB)
%end;
%mend;
然后,从理论上讲,我会在代码中调用%macro,但是另一个问题是,我需要在代码中的不同时间从此列表中选择每个变量。是一个问题,还是我的宏通过查看第1行来工作,请遍历我的整个代码/计算集,吐出值1,然后回到开头,并查看第2行,遍历代码/计算,值2等等直到148176?
答案 0 :(得分:0)
没有您正在做的计算的更多细节,很难回答。例如,您可能只需要在数据步骤中进行所有计算,而不必使用宏变量或宏。
但是,如果已将对一组参数的分析构造为宏,则可以使用数据集生成对宏的多次调用。尽管对一个长而复杂的宏的150K调用很多。
假设您有一个名为%MYMACRO的宏,该宏具有2个输入参数。您有一个SAS数据集,其中包含2个变量以及这些参数的值。然后,您可以使用CALL EXECUTE()或其他代码生成方法来为每个观察值生成一个宏调用。
对于这种规模的代码生成,我发现使用数据步骤编写代码比使用CALL EXECUTE更容易理解和调试。特别是如果您使用与宏参数相同的名称来命名数据集变量。
filename code temp;
data _null_;
set my_metadata ;
file code ;
put '%mymacro(' var1= ',' var2= ')';
run;
%include code /source2;