我一直在寻找解决方案,但我无法在社区中找到SAS中的任何类似问题。所以这是我的问题:我有一个很大的SAS表:让我们说2个类和26个变量:
A B Var1 Var2 ... Var25 Var26
-----------------------------
1 1 10 20 ... 35 30
1 2 12 24 ... 32 45
1 3 20 23 ... 24 68
2 1 13 29 ... 22 57
2 2 32 43 ... 33 65
2 3 11 76 ... 32 45
...................
...................
我需要通过Class = B来计算所有26个变量的累积和,这意味着对于A = 1,它将累积到B = 1,2,3;对于A = 2,它将通过B = 1,2,3累积。结果表将如下:
A B Cum1 Cum2 ... Cum25 Cum26
-----------------------------
1 1 10 20 ... 35 30
1 2 22 44 ... 67 75
1 3 40 67 ... 91 143
2 1 13 29 ... 22 57
2 2 45 72 ... 55 121
2 3 56 148 .. 87 166
...................
...................
我可以选择艰难的方式,比如在循环中描述26个变量中的每个变量,然后我可以通过B找到累积总和。但我想找到一个更实用的解决方案,而不描述所有变量。
在其中一个网站上建议了这样的解决方案:
proc sort data= (drop=percent cum_pct rename=(count=demand cum_freq=cal));
weight var1;
run;
我不确定是否有像#34; Weight"在Proc Sort中,但如果它有效,那么我认为也许我可以通过输入 numeric 而不是Var1来修改它,然后Proc Sort过程可以对所有数值进行处理:
proc sort data= (drop=percent cum_pct rename=(count=demand cum_freq=cal));
weight _numerical_;
run;
有什么想法吗?
答案 0 :(得分:6)
实现此目的的一种方法是使用2' parallel'数组,一个用于输入值,另一个用于累积值。
%LET N = 26 ; data cum ; set have ; by A B ; array v{*} var1-var&N ; array c{*] cum1-cum&N ; retain c . ; if first.A then call missing(of c{*}) ; /* reset on new values of A */ do i = 1 to &N ; c{i} + v{i} ; end ; drop i ; run ;