【目的】
(1)通过SQL将要查询的多个结果保存到多个宏变量里面;
(2)通过MACRO将多个宏变量的值汇总到一个变量里面用于进一步分析。
【程序】
*创建一个样例数据库temp;
data temp;
do i=1 to 10;
output;
end;
run;
%macro matrix();
proc sql ;
select i into :x1 - :x10 from temp;
*将i的值传递给变量x1-x10.以下的程序实现如何在宏中汇总x1-x10;
*%put &x1;
quit;
%let sm=0;
%do i=1 %to 10;
%let sm=&sm+&&x&i;
*这里的sm是一串字符串相当于0+1+2+3+4...+10;
%end;
%let result=%eval(&sm);
*%eval执行上面那串字符串的值,并赋给result变量。这个也就是SAS MACRO的基本逻辑,先翻译成可计算的语句,再执行;
%put &result;
%mend;
%matrix();
还有两种办法实现,一种是使用sql create table,然后insert记录,再用proc mean统计,效率太低;另一种是使用数组,将x1-x10的值赋给数组变量,再求和。好像都很麻烦,我居然没有发现数组行求和或者列求和的函数;从这个角度发现还是R 的向量运算的效率比较高。
这个问题在goolge baidu上面检索了一整天,看了一堆的英文资料,居然没有发现很好的答案,有一篇资料是说用%sysfunc(sum())的方法,但没有人提出最终解决方案。于是整理提交我的方法方便其他同志查询。
思考:如果要考虑计算平均数;如果考虑到缺失值;是否可以考虑用户自定义函数(SAS提供的新功能)