2017-02-27 9 views
0

Ich versuche, mehr über Proc Expand und SAS im Allgemeinen zu lernen. Ich bin nicht in der Lage gewesen, viel Licht in die Frage zu bringen, wie mehrere Operationen bei der Transformation zusammenarbeiten. Wenn ich den untenstehenden Code ausführe, scheint SAS einfach eine sich rückwärts bewegende Summe für zwei Zeilen zu berechnen.Wie funktionieren mehrere Operationen in der Umwandlung?

proc expand data=averages out=transformed; 
id date; 
convert x=y/transformout=(reverse movsum 2 movsum 1 reverse); 
by type notsorted; 
run; 

Hier ist ein Beispiel der Ergebnisse:

y  x 
13372 1225 
20564 12147 
16140 8417 
14446 7723 
13097 6723 
15976 6374 
11497 9602 
12704 1895 
18043 10809 

Wenn ich den Code ein wenig zu ändern, kann ich keine Muster mit finden, wie die Zahlen in SAS generiert werden. Hier ist der modifizierte Code.

proc expand data=averages out=transformed; 
id date; 
convert x=y/transformout=(reverse movsum 5 movsum 3 reverse); 
by type notsorted; 
run; 

Hier sind die Ergebnisse dieser Code:

y  x 
116458 1225 
112540 12147 
106559 8417 
103634 7723 
107010 6723 
103592 6374 
103655 9602 
100326 1895 
94840 10809 

Wie SAS mehrere Operationen in dieser Situation umgehen? Bis jetzt konnte ich bei Google nichts finden oder verschiedene Szenarien mit dem Code ausprobieren.

+0

Wo ist die Variable 'TYPE' in der Anweisung' BY'? Oder sind alle Werte, die Sie für eine Ebene von TYPE gebucht haben? – Tom

+0

@Tom Tut mir leid, ich hätte dieses Stück Code klären oder entfernen sollen. Die geposteten Werte sind alle vom selben TYPE. – Jarom

Antwort

0

Es sieht so aus, als ob es nur das Zwischenergebnis berechnet und die Funktion darauf anwendet. So ist Ihre Verwendung von movsum 5 movsum 3 die gleiche wie wenn Sie einen proc Schritt mit movsum 5 und dann einen anderen Schritt mit movsum 3 getan hätten.

Also, wenn Sie dieses Programm ausführen.

data have ; 
    input x @@ ; 
cards; 
1225 12147 8417 7723 6723 6374 9602 1895 10809 
; 

proc expand data=have out=out1 ; 
    convert x=movsum2/transformout=(reverse movsum 2 reverse); 
    convert x=movsum5/transformout=(reverse movsum 5 reverse); 
run; 

proc expand data=out1 out=final ; 
    convert x=y1/transformout=(reverse movsum 2 movsum 1 reverse); 
    convert movsum2=y2/transformout=(reverse movsum 1 reverse); 
    convert x=z1/transformout=(reverse movsum 5 movsum 3 reverse); 
    convert movsum5=z2/transformout=(reverse movsum 3 reverse); 
run; 

Sie sehen, dass Y1 = Y2 und Z1 = Z2.

Verwandte Themen