2016-07-03 86 views
0

我有一個數據集,看起來像這樣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; 

我想補充一點,計算是什麼比例相應total的總和內id1id2列。

我的意思是這個; id1的值爲A.在A的值內,有兩個id2值; D和E.有兩個D值和E中的一個.D的兩個值分別爲51和23,總和爲74. E的值爲10,總和爲10.列我想創建將分別保留行1,行2和行3中的.68(51/74),.31(23/74)和1(10/10)的值。

我需要爲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

用數據步驟很容易。確保記錄已排序。 您可以找到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; 
+0

哇 - 這很容易!非常感謝@Tom。 –