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

how to include a do loop inside a macro in SAS?

以下是我的数据集示例

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;

有问题

当你编码时:

&dataout_&maxj

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

,您的宏应该可以工作
out=&dataout&j

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

out=&dataout._&j

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

%macro beta (datain=, n=, reps=1, dataout=);
proc surveyselect data=&datain
   method=srs n=&n reps=&reps out=&dataout;
run;
%mend;

*Pull one sample of 5 records ;
%beta(datain=have,n=5,dataout=want)

*Pull three samples of 5 records ;
%beta(datain=have,n=5,reps=3,dataout=want)