2016-12-16 2 views
0

Ich mache die Übungen aus dem SAS Programming 2 Lehrbuch.SAS: Konvertieren schmaler zu weiter Datensatz

Ich versuche, diese Daten zu konvertieren:

Narrow Data set Um eine große Datensatz wie folgt aus:

Wide Data Set Ich bin auch ein Array haben in meinem Daten Schritt und nur dann ausgegeben, soll die Variable customer_id und month1 bis month12.

Mein Code ist folgende:

Data customer_orders(keep=Customer_ID month1-month12); 
set orion.order_summary; 
by customer_id; 
array month{12} month1-month12; 
do i= 1 to 12; 
if order_month = i then  
month{i}= sale_amt; 
end; 

run; 

proc print data=customer_orders; 
run; 

Mein Problem, wenn ich diesen Code ausführen, dass die Beobachtungen alle der sale_amt Werte für customer_id nicht in einer Beobachtung angezeigt, sondern springt in die nächste Zeile angezeigt werden der zweite in der Beobachtung gefundene Wert.

Jede Hilfe würde sehr geschätzt werden.

Hinweis: Ich bin nicht berechtigt, einen anderen Link zu veröffentlichen, wie meine Ausgabe aussieht.

+0

Sie müssen RETAIN verwenden, um Variablen über Zeilen hinweg zu speichern. Andernfalls werden die Array-Variablen in jeder Zeile auf "Missing" gesetzt. Sie benötigen auch eine explizite OUTPUT-Anweisung. – Reeza

Antwort

1

Wie Sie kommentiert haben, müssen Sie eine Retain-Anweisung festlegen, um Ihre Werte in eine nächste Zeile zu übernehmen, da SAS während des Verarbeitungsschritts Werte auf fehlend setzt. Last.cust_id nimmt dann nur die letzte Zeile pro Kunden-ID, und diese Zeile sollte alle Ihre Beobachtungen für diesen Kunden enthalten.

Dies behält sie jedoch für alle Werte nachher, bis anders angegeben. Wenn Sie also first.cust_id verwenden, können Sie alle Werte bei jeder neuen Kunden-ID als fehlend festlegen.

data test; 

input Cust_id Month Sale_Amt; 
Datalines; 
5 5 478 
5 6 126.8 
5 9 52.50 
5 12 33.8 
10 3 32.60 
10 1 200 
; 

run; 

proc sort data = test out = test_sort; 
    by cust_id month; 
run; 


data test2 (drop = month sale_amt i); 

    set test_sort; 
    by cust_id; 

    array holder (*) Month1-Month12; 

    retain Month1-Month12; 

    do i = 1 to 12; 
    if first.cust_id then holder{i} = .; 
    if month = i  then holder{i} = sale_amt; 
    end; 

    if last.cust_id; 

run; 
Verwandte Themen