SAS用于计算两个分层的行百分比的函数

时间:2016-07-03 21:21:14

标签: sas

我有一个看起来像这样的数据集

data test;
    input id1$ id2$ score1 score2 score3 total;
    datalines;
A   D   9   36  6   51
A   D   9   8   6   23
A   E   5   3   2   10
B   D   5   3   3   11
B   E   7   4   7   18
B   E   5   3   3   11
C   D   8   7   9   24
C   E   8   52  6   66
C   D   4   5   3   12 
  ;
 run;

我想添加一个列,用于计算totalid1中总和的相应id2的百分比。

我的意思是这个; id1的值为A.在A的值内,有两个id2值; D和E.有两个D值和一个E. D的两个total值是51和23,它们总和为74.E的一个total值是10,它总和为10.我想要创建的列将保留第1行第2行中的.68(51/74),。31(23/74)和1(10/10)的值。第3行。

我需要为id1的其余部分及其对应的id2执行此计算。所以当完成后,我想要一个像这样的表:

id1 id2 score1  score2  score3  total   percent_of_total
A   D   9       36      6       51      0.689189189
A   D   9       8       6       23      0.310810811
A   E   5       3       2       10      1
B   D   5       3       3       11      1
B   E   7       4       7       18      0.620689655
B   E   5       3       3       11      0.379310345
C   D   8       7       9       24      0.666666667
C   E   8       52      6       66      1
C   D   4       5       3       12      0.333333333

我意识到一个循环可能能够解决我给出的问题,但我正在处理八个级别的分层,在这些级别内有多达98个子级别。循环不实用。我正在考虑PROC SUMMARY的问题,但我对这个功能并不太熟悉。

谢谢。

1 个答案:

答案 0 :(得分:1)

使用数据步骤很容易。确保记录已排序。 您可以找到ID1 * ID2组合的总计,然后使用它来计算百分比。

proc sort data=test;
  by id1 id2;
run;

data want ;
  do until (last.id2);
    set test ;
    by id1 id2 ;
    grand = sum(grand,total);
  end;
  do until (last.id2);
    set test ;
    by id1 id2 ;
    precent_of_total = total/grand ;
    output;
  end;
run;