如何在SAS中的宏中包含do循环?

时间:2018-05-05 20:27:49

标签: random sas sas-macro

以下是我拥有的数据集的示例

data have;
input institution$ GPA;
cards;
    A   3.2
    AB  3.4
    BC  4.0
    DF  3.2
    A   4.0
    A   3.0
    A   3.5
    A   3.7
    A   3.8
    F   3.8
    D   3.2
    D   3.1
    D   3.7
;
run;

基本上我想创建一个从该数据集中选择随机样本的宏(实际数据集要大得多)。我还想模拟这个采样过程,这样我可以进行50次采样迭代,每次迭代,我得到一个输出数据集。我尝试创建以下宏来执行此操作

%macro beta (maxj=,datain= ,numofsamples= , dataout=,);
%do j=1 %to &maxj;
proc surveyselect data=&datain
   method=srs n=&numofsamples out=&dataout_&maxj;
run;
%end;
%mend;


%beta (maxj=4 ,datain=have ,numofsamples=5,dataout=pool);

基本上当我运行它时,想要获取输出数据集,以便将它们命名为pool_1,pool_2,pool_3 etc.

然而,当我运行这个宏时,它似乎没有按照我的意图行事。相反,它表明&dataout_&maxj; run;

有问题

1 个答案:

答案 0 :(得分:2)

编码:

appcompat 25.0.0

SAS将看到名为DATAOUT_的宏变量的宏引用和宏变量MAXJ的引用。您没有名为DATAOUT_的宏变量,因此无法解析引用。你有一个没有下划线的宏变量DATAOUT。而且看起来你想要宏变量J作为后缀,而不是MAXJ。因此,如果将其更改为:

,则宏应该可以正常工作
&dataout_&maxj

如果要在输出数据集的名称中使用下划线,可以使用点来结束宏变量引用:

out=&dataout&j

也就是说,使用PROC SURVEYSELECT,您不需要自己编写循环代码。您可以使用NREP选项来提取多个样本。这应该比调用PROC SURVEYSELECT N次更有效。所以你的宏可能就像:

out=&dataout._&j