SAS:如何从%DO循环中保存多个ODS输出

时间:2018-03-27 22:07:17

标签: sas

data scores;
   length name $ 12;
   input name $ score1 score2;
   datalines;
Riley 1132 1187
Henderson 1015 1102
;

%MACRO DO_MEAN;
%DO I = 1 %TO 10;
 PROC MEANS data = scores;
 VAR score1;
 TITLE "Average math score";
 RUN;
%END;
%MEND DO_MEAN; 

ods output Summary = Summary;
%DO_MEAN;

我有一个名为%DO_MEAN的简单宏,用于计算数据集中的平均值score1。我希望宏从i = 1到10次运行。

调用宏输出MEANS程序的结果10次。是的,我知道输出完全相同,但我只是想用这个可重复的例子来说明。

在调用宏来存储我的10个输出之前,我尝试使用ods output Summary = Summary;。但是,生成的Summary数据集只有1行。如何调整代码以便存储所有10个输出?

enter image description here

我希望上面得到的ods数据集有10行,每行对应于%DO循环迭代之一。

2 个答案:

答案 0 :(得分:0)

您可以在ODS OUTPUT语句中使用PERSIST选项,如下所示: http://documentation.sas.com/?docsetId=odsug&docsetTarget=p0oxrbinw6fjuwn1x23qam6dntyd.htm&docsetVersion=9.4&locale=en

ods output parameterestimates (persist=proc) = want;
proc reg data=sashelp.class;
where sex='F';
model height = weight;
run;

proc reg data=sashelp.class;
where sex='M';
model height = weight;
run;

quit;

ods output clear;

但最好的答案是首先不要这样做,而是使用BY组。

proc sort data=sashelp.class out=class; by sex; run;

ods output ParameterEstimates = want2;
proc reg data=class;
by sex;
model height = weight;
run;

编辑:您可以使用ods outputods table,但我在此示例中使用了两者并将其修改为一致。

答案 1 :(得分:0)

如果要存储每次运行的输出;您必须通过附加结果将它们保存到同一数据集中。因此,请使用PROC APPEND

注意:我将你的ODS输出和Proc移动到你的循环中,所以ods表将附加每个循环:

代码:

/*Create an empty base table*/
proc sql;
create table WORK.ods_output
  (
   score1_N num format=BEST1. label='N',
   score1_Mean num format=BEST12. label='Mean',
   score1_StdDev num format=BEST12. label='Std Dev',
   score1_Min num format=BEST12. label='Minimum',
   score1_Max num format=BEST12. label='Maximum'
  );
quit;

%MACRO DO_MEAN;
%DO I = 1 %TO 10;
 PROC MEANS data = scores;
 VAR score1;
 TITLE "Average math score";
 RUN;

ods output Summary = Summary;
proc append base=ods_output data=summary; quit;
%END;

%MEND DO_MEAN; 

%DO_MEAN;

包含10行的输出表:(忽略日志警告)

score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132 
score1_N=2 score1_Mean=1073.5 score1_StdDev=82.731493399 score1_Min=1015 score1_Max=1132