[英]SAS: Summing in proc sql
我正在做一个SAS项目,要求我对行进行总结。 这是我的代码:
proc sql;
create table total as
select
sum(ans1) as sum1,
sum(ans2) as sum2,
sum(ans3) as sum3,
sum(ans4) as sum4
from proj.scores;
quit;
我的问题是有150个变量(标记为ans1-ans150)。 有没有一种方法可以对每个变量进行求和,而不必继续我一直达到的150?
我认为适当的工具将使整个过程更加容易。 SQL没有用于处理大量变量的功能。
proc summary;
output out=sum sum(ans1-ans150)=sum1-sum150;
run;
是的,您可以使用宏逻辑并用循环替换您的1、2、3 ...行来执行此操作。 此方法使用“ backstop”变量,以便循环中的逗号不会在循环的第150次迭代中引起错误(删除此变量)。
%macro summer;
proc sql;
create table total (drop = backstop) as select
%do i = 1 %to 150;
sum(ans&i.) as sum&i.,
%end;
"" as backstop
from proj.scores;
quit;
%mend summer;
%summer;
更好的方法(我认为)是通过以下方式使用宏:
data have;
input x1-x10;
datalines;
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
;;;;
run;
%macro sum_loop(prefix=, outfix=, start=1, end=);
%local i;
%do i = &start. %to &end.; /* loop over start to end */
sum(&prefix.&i.) as &outfix.&i. /* the actual SQL statement */
%if &i < &end %then %do; , %end; /* that way you get commas after all non-last entries */
%end;
%mend sum_loop;
proc sql;
create table total as
select
%sum_loop(prefix=x,outfix=sum,start=1,end=10)
from have
;
quit;
这样,宏只负责您需要循环的内容。 这使得它更可重用且更易于维护-WHERE和FROM等是分开的。更好的办法是将内部拆分为自己的宏,并具有通用的looper宏,但在这里可能会过大...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.