我有一个看起来像这样的数据集
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;
我想添加一个列,用于计算total
和id1
中总和的相应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
的问题,但我对这个功能并不太熟悉。
谢谢。
答案 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;