Summe im proc transpose

Hallo Leute,

ich arbeite erst seit kurzer Zeit mit SAS. Jetzt komme ich mit Kreuztabellen nicht weiter. Ich habe mir eine normale Kreuztabelle erstellt, möchte nun aber eine Spalte hinzufügen, die mir die Summe alle Einzelwerte ausgibt. Kann mir jemand schnell auf die Sprünge helfen? Das Feld Anz bildet die Werte in der Abfrage pro Datum. Die Gesamtsumme soll die Summe aller Werte (Anz) pro Zeile ausgeben.


PROC SORT
DATA=WORK.SUMFAQF(KEEP=ANZ AUSSTDAT AUSGRUND AGR_Text BGVG ABTREV)
OUT=WORK.UA_SUMFAQF
;
BY AUSGRUND AGR_Text BGVG ABTREV;
RUN;


PROC TRANSPOSE DATA=WORK.UA_SUMFAQF
OUT=WORK.Kreuz_SUMFAQF(LABEL="Transponiertes WORK.SUMFAQF")
LET
NAME=Quelle
LABEL=Etikett
SUMVAR=ANZ
;
BY AUSGRUND AGR_Text BGVG ABTREV;
ID AUSSTDAT;
VAR ANZ;
RUN;
QUIT;

Proc Transpose kann nicht summieren

Hallo,

mit "Proc Transpose" kann man nicht gleichzeitig summieren und transponieren.
Zum Berechnen der Tabelle kann man gut "Proc Tabulate" nehmen.

/*Definieren der Gruppierungsvariablen */
%LET Wert = Anz;
%LET Spalte = AUSSTDAT;
%LET Zeile = AUSGRUND AGR_Text BGVG ABTREV;
%LET Zelle = &Spalte. &Zeile.;
%LET ZeileTabulate = %SYSFUNC(TRANSLATE(&Zeile., %STR(*),%STR( )));

/*Berechnen der Daten*/
PROC TABULATE
DATA = SUMFAQF
OUT = SUMFAQF1(Rename = (&Wert._Sum = &Wert.))
;
CLASS &Zelle.;
VAR &Wert. ;
TABLE &ZeileTabulate. , (&Spalte. ALL) * &Wert. * SUM /PRINTMISS;
RUN;

Möchte man nur die Tabelle als Ergebnis haben, ist man jetzt fertig. Will man allerdings einen SAS-Dataset in derselben Form haben, muss man die Ausgabe noch ein wenig nacharbeiten.

/* Benennen der Spalten */
DATA SUMFAQF2;
SET SUMFAQF1;
LENGTH Spalten $12;
IF _TYPE_ =: "0" THEN DO;
Spalten = "Gesamt";
END;
ELSE DO;
Spalten = "_" || PUT( AUSSTDAT, DDMMYY10.);
Spalten = TRANSLATE(Spalten, "_", "/");
END;
RUN;

/* Sortieren für Proc Transpose und Transponieren*/
PROC SORT DATA = SUMFAQF2 OUT = SUMFAQF3 ; BY &Zeile.; RUN;
PROC TRANSPOSE DATA = SUMFAQF3 OUT = SUMFAQF_KREUZ;
VAR &Wert. ;
BY &Zeile. ;
ID Spalten;
RUN;

PROC DELETE DATA = SUMFAQF1 SUMFAQF2 SUMFAQF3; RUN;

Schöne Grüße

Jan

Beim "PROC TRANSPOSE" Spaltenreihefolge gewährleisten

Hallo Jan,

besten Dank für Deine Hilfe. Hat bei mir auf Anhieb das Ergebnis gebracht, das ich benötige.
Ich habe nur noch ein Problem. Die Reihenfolge der erzeugten Spalten bei Ausgabe des SAS-Datei durch den Transpose ist nicht korrekt sortiert. Hast Du da vielleicht noch ein Lösung? Wäre nett!

Viele Grüße
Mario

Hallo Mario, welche Form hat

Hallo Mario,

welche Form hat AUSSTDAT? Text oder numerisch? Sind die Spalten alphabetisch sortiert oder völlig durcheinander? Stimmt die Sortierung der Spalten in der entstehenden Tabelle des Tabulate-Statements? Kannst du ein paar Beispieldatensätze zeigen?
Eigentlich müßten die Spalten genauso wie in Tabulate geordnet sein.

Schöne Grüße

Jan

Spaltensortierung im proc transpose

Hallo Jan,

das AUSSTDAT ist noch ein Textfeld (wird in Zukunft ein Datumsfeld). Die Spalten sind teilweise richtig sortiert, es gibt dann aber Brüche. Die Sortierung im Tabulate ist korrekt, aber die im Transpose nicht. Das liegt sicher am "proc sort". Ich denke, wenn die Daten durch den Transpose "gekippt werden" muß die Tabelle nach AUSSTDAT sortiert sein, sonst geht's schief, oder?
Wenn ich aber den "proc sort" ändere, bekomme ich das gewünschte Transpose Ergebnis nicht hin.
(Bin dann ab heute 15 Uhr im Urlaub [bis 01.09.])

BSP:
20090727 20090728 20090729 Gesamt 20090715 20090716

Ich denke, dass die Ursache ist, dass bei den Daten beim 1. angeschriebenen AGR einige Datumwerte nicht existieren, bei den weiteren AGR dann doch. Das wird in der ausgegebenen Tabelle auch so wiedergegeben. Ich weiß nicht, wie man das lösen sollte.

Viele Grüße
Mario

Spalten mit Macrovariable sortieren

Hallo Mario,

es müsste eigentlich auch funktionieren mit Missing Values in den Klassenvariablen. Wenn die Option Missing in Tabulate gestzt ist, sind Missing Values gültige Werte, ansonsten werden sie nicht mit in die Auswertung einbezogen.
Hast du vielleicht in Proc Tabulate beim Erstellen der Tabelle die Option PRINTMISS "wegoptimiert"? Die ist für die richtige Sortierung der Spalten nach Proc Transpose wichtig.
Die Spalte AUSSTDAT sollte nicht sortiert werden, und wenn überhaupt hinter den Zeilenvariablen. Also

PROC SORT DATA = SUMFAQF2 OUT = SUMFAQF3 ; BY &Zeile. &Spalte.; RUN;

Allerdings wird dann die Gesamtspalte eventuell verschoben.
Um nur die Spalten zu sortieren kann man in deinem Fall auch eine Macrovariable erzeugen, da das Datum in der YMD Reihenfolge ist.

PROC SQL noprint;
SELECT DISTINCT Spalten INTO :Spalten SEPARATED BY " " FROM SUMFAQF2 WHERE Spalten NE "Gesamt";
QUIT;
DATA SUMFAQF_KREUZ1;
RETAIN &Zeile. &Spalten. Gesamt;
SET SUMFAQF_KREUZ;
RUN;

Bei ganz vielen Spalten kann es dann aber Probleme geben, da eine Macrovariable nur eine bestimmte Zahl von Zeichen aufnehmen kann.

Schöne Grüße

Jan

Vielen Dank!

Danke Jan, hast mir sehr geholfen. Hat prima funktioniert.

Besten Gruß
Mario