我正在使用SAS sql创建一些宏变量供以后使用和打印报告。
我按组创建一些汇总变量(平均值,最小值,最大值等)。
以下代码适用于第一组,但不会为第二组和第三组创建宏变量。
data scores;
input trt t;
cards;
1 10
1 11
1 12
1 13
2 4
2 5
2 6
2 7
3 9
3 8
3 7
3 6
;
run;
%macro cdi;
%do i = 1 %to 3;
proc sql noprint;
select n(t), nmiss(t), mean(t), std(t), min(t), max(t)
into :n&i, :miss&i, :mean&i, :sd&i, :min&i, :max&i
from scores
where trt = &i;
quit;
%end;
%mend cdi;
%cdi;
***** this call shows the right values ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;
***** this call produces error (symbolic reference not resolved) ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;
我确定我错过了一些简单的东西,但我还没有看到它......
答案 0 :(得分:4)
您的问题是您创建的宏变量是宏的本地变量。如果您希望在宏执行后存在,则需要在宏内部使用%global
语句定义它们。
换句话说,将其添加到宏定义的顶部:
%global n1 miss1 mean1 sd1 min1 max1
n2 miss2 mean2 sd2 min2 max2
n3 miss3 mean3 sd3 min3 max3 ;
答案 1 :(得分:2)
为什么要创建汇总值的宏变量?实际上很少有人将它创建为一个表供以后使用并不是更好......而且它更快,更简单,更灵活。
proc sql;
create table summary as
select trt, n(t) as n, nmiss(t) as nmiss, mean(t) as mean, std(t) as std, min(t) as min, max(t) as max
from scores
group by trt;
quit;
或者,因为你在SAS ...
proc means data=scores;
var t;
class trt;
types trt;
output out=summary n= nmiss= mean= std= min= max= /autoname;
run;
然后在您希望的报告中使用它 - 或者将其合并回主数据集,如果这更容易的话。数据应该是数据,宏变量不应该是数据,而是程序输入。
答案 2 :(得分:-2)
%macro cdi;
%do i = 1 %to 3;
proc sql noprint;
select n(t), nmiss(t), mean(t), std(t), min(t), max(t)
into :n&i, :miss&i, :mean&i, :sd&i, :min&i, :max&i
from scores
where trt = &i;
quit;
%end;
***** this call shows the right values ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;
***** this call NO LONGER produces error (symbolic reference not resolved) ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;
%mend cdi;
%cdi;