我一直在寻找解决方案,但我在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
...................
...................
Run Code Online (Sandbox Code Playgroud)
我需要通过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
...................
...................
Run Code Online (Sandbox Code Playgroud)
我可以选择艰难的方式,比如在循环中描述26个变量中的每一个,然后我可以通过B找到累积和.但我想找到一个更实际的解决方案,而不描述所有变量.
在其中一个网站上建议了这样的解决方案:
proc sort data= (drop=percent cum_pct rename=(count=demand cum_freq=cal));
weight var1;
run;
Run Code Online (Sandbox Code Playgroud)
我不确定在Proc Sort中是否有像"Weight"这样的选项,但是如果它有效,那么我想也许我可以通过放置数字而不是Var1 来修改它,然后Proc Sort过程可以对所有数值进行处理价值观:
proc sort data= (drop=percent cum_pct rename=(count=demand cum_freq=cal));
weight _numerical_;
run;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
实现此目的的一种方法是使用2个"并行"数组,一个用于输入值,另一个用于累积值.
%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 ;