如何在 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)
以下是我的数据集示例
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)