2016-07-03 7 views
0

Ich habe einen Datensatz, wie dieseSAS Funktion Prozentsatz für zwei Schichtungen für Zeile berechnen

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; 

ich eine Spalte hinzufügen möchten sucht, die berechnet, wie viel Prozent der entsprechenden total der Summe innerhalb id1 und id2 ist .

Was ich meine ist das; id1 hat einen Wert von A. Innerhalb des Werts von A gibt es zwei id2 Werte; D und E. Es gibt zwei Werte von D und einen von E. Die zwei total Werte von D sind 51 und 23, und sie summieren sich zu 74. Der Wert von E ist 10, und es summiert sich zu 10. Die Spalte Ich würde gerne die Werte von .68 (51/74), .31 (23/74) und 1 (10/10) in Zeile 1, Zeile 2 und Zeile 3 halten.

Ich muss diese Berechnungen für den Rest der id1 und ihre entsprechenden id2 durchführen. Also wenn Sie fertig sind, habe ich eine Tabelle wollen, die wie folgt möchte:

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 

Ich weiß, eine Schleife in der Lage sein könnte, das Problem, das ich gegeben habe, zu lösen, aber ich bin mit acht Ebenen der Schichtung Umgang mit als viele als 98 Unterstufen innerhalb dieser Ebenen. Eine Schleife ist nicht praktikabel. Ich denke etwas in Richtung PROC SUMMARY, aber ich bin nicht mit der Funktion vertraut.

Vielen Dank.

Antwort

1

Es ist einfach mit einem Datenschritt zu tun. Stellen Sie sicher, dass die Datensätze sortiert sind. Sie können die Gesamtsumme für die ID1 * ID2-Kombination finden und sie dann verwenden, um den Prozentsatz zu berechnen.

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

Wow - das war einfach! Vielen Dank @Tom. –

Verwandte Themen