以下是我拥有的数据集的示例
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;
行
答案 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