SAS中多列的累积和

时间:2015-06-29 13:35:58

标签: sas

我一直在寻找解决方案,但我无法在社区中找到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;

有什么想法吗?

1 个答案:

答案 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 ;