2017-06-26 9 views
-1

Ich muss Zeilen in Spalten in SAS konvertieren. Meine Frage ist fast identisch mit dieser: Convert Database Rows into ColumnsSAS-Zeilen in Spalten

Der Hauptunterschied ist, dass ich Arrays dafür verwenden muss. Ich bin mir nicht ganz sicher, wie ich das angehen soll. Ich habe TRANSPOSE angeschaut, aber das passt nicht wirklich zu den Kriterien meiner Frage. Ich würde mich über Ratschläge freuen, wie Sie diese Frage starten oder wie Sie sie angehen.

Danke.

Edit:

Data old; 
input id year cost; 
datalines; 
1 1998 20 
1 1999 30 
1 2000 40 
2 1998 20 
2 1999 21 
2 2000 25 
3 1998 32 
3 1999 33 
; 
run; 

data want; 
set old; 
by ID; 
array allcost(3) c1 - c3; 
retain c1-c3; 
if first.id then i=1; 
else i+1; 
allcost(3) = cost; 
if last.id; 
run; 

Was ich diese aussehen soll:

 1998 1999 2000 

1  20 30 40 
2  20 21 25 
3  32 33 

Statt dieses Ergebnis zu bekommen, erhalte ich eine Liste der Kosten in der c3 Spalte. Was mache ich falsch? Beachten Sie, dass c1-c3 die Jahre darstellen.

+1

für einen Tisch dreht, [ 'PROC TRANSPOSE'] (http://support.sas.com/documentation/cdl/en/proc/70377/HTML/default/viewer.htm#p1r2tjnp8ewe3sn1acnpnrs3xbad.htm) Beantwortet die Frage. Sie sprechen über Arrays, aber Sie haben uns noch nicht gesagt warum. Wahrscheinlich werden Sie sich [PROC TABULATE'] anschauen wollen (http://support.sas.com/documentation/cdl/en/basess/68381/HTML/default/viewer.htm#n1k5pgl78tt14pn19adlvtvyw8l1.htm) . – Code4R7

+0

Danke, ich bin nicht sicher, wo ich die Arrays verwenden muss, um dieses Ergebnis zu erreichen, da die Frage, die ich beantworten muss, nicht spezifiziert ist, daher die Verwirrung. – buffalol

+0

Bitte posten Sie einige Beispieldaten, und ein Beispiel für das Ausgabe-Dataset, das Sie erstellen möchten, wird sowohl als Text in Ihrer Frage eingegeben, als auch, um zu verdeutlichen, ob Proc-Transponierung angebracht ist. – user667489

Antwort

2

Es sieht aus wie Sie die richtige Idee haben, aber Ihre nur Werte in der Spalte c3 bekommen, weil die Aussage allcost(3) nur in der Anordnung der dritten Position zeigt, so dass Sie den Wert von i als Index verwenden müssen.

Lassen Sie uns eine kleine Änderung an Ihrem Code vornehmen und sehen, was passiert.

Dieser Code scheint ziemlich nah zu kommen, aber lassen Sie uns die Ausgabe überprüfen.

id _1998 _1999 _2000 

1  20  30  40 
2  20  21  25 
3  32  33  25 

Alles sieht hier außer für die dritte Reihe für _2000. Dies liegt daran, dass der Wert für _2000 in der letzten By-Group nie ersetzt wurde. Um dies zu beheben, können wir das Array am Anfang jeder By-Group löschen.

data new(drop=year cost i j); 
set old; 
by id; 
retain _1998-_2000; 
array costs(3) _1998-_2000; 
if first.id then do; 
    do j = 1 to 3; 
     costs(j) = .; * set each value in array to missing.; 
    end; 
    i = 1; 
end; 
else i + 1; 
costs(i) = cost; 
if last.id then output; 
run; 

Jetzt sieht der resultierende Datensatz korrekt aus.

id _1998 _1999 _2000 

1  20  30  40 
2  20  21  25 
3  32  33  . 
+0

Vielen Dank! – buffalol

+0

@J_Lard ausgezeichnete Antwort - Ich wünschte, es gäbe einen Weg zu Favoriten Antworten. Ich frage mich, warum nicht ... –