Hallo zusammen,
ich habe eine SAS-Tabelle mit folgenden Werten
Aus diesen Werten möchte ich mit PROC TABULATE eine Kreuztabelle erstellen:
PROC TABULATE
DATA=WORK.BW_BERICHT_ENDG_T00(FIRSTOBS=1 );
VAR WB WAEHLER U_ERSTSTIMMEN G_ERSTSTIMMEN;
CLASS STATUS / ORDER=DATA MISSING;
CLASS WERTART / ORDER=DATA MISSING;
TABLE
(WB * Sum=' ' WAEHLER * Sum=' ' U_ERSTSTIMMEN * Sum=' ' G_ERSTSTIMMEN * Sum=' ' ),
STATUS='' * WERTART='';
;
RUN;
Das Ergebnis sieht dann so aus:
Ist es möglich, und wenn ja wie, die Originalformate der numerischen Variablen in die Tabelle zu übernehmen, sodass die absoluten Werte ohne Kommastellen angezeigt werden und die Prozentwerte mit Kommastellen?
Viele Grüße
Holger Pietschmann
Hallo Herr Pietschmann,
Sie müssen dafür das Datenmodell ändern, denn in Proc Tabulate kann man eine Formatzuweisung immer nur auf eine Spalte legen. Sie benötigen eine Spalte für die absoluten und eine für die Prozentwerte, die Information vorläufiges/endgültiges Ergebnis sowie die Gruppe (Wahlberechtigte, Wahler, ungültig, gültig) landen in zwei Gruppierungsvariablen.
Im Proc Tabulate wandern die Analysevariablen dann in die Spalten-Dimension - hier kann ganz einfach mit VARIABLE * F=format-name ein Format angegeben werden.
Hier ein Beispiel zur Verdeutlichung, ich habe Ihre Daten als Input genommen (allerdings ein paar Nachkommastellen weggelassen).
Die erzeugte Datei sieht anders aus als bei Ihnen, statt der Wertart und einzelnen Variablen für die Werte gibt es eine Spalte Gruppe, die die spätere Aufteilung in der Zeilen-Dimension enthält und zwei Variablen für absolut und Prozent. Der Status bleibt als Gruppierungsvariable in der Spalten-Dimension erhalten.
Data Work.test2;
length status $64 gruppe $16 absolut prozent 8;
input status & gruppe absolut prozent;
Cards;
vorläufiges Ergebnis WB 3399454 .
vorläufiges Ergebnis Waehler 2368615 69.676
vorläufiges Ergebnis u_erststimmen 44038 1.859
vorläufiges Ergebnis g_erststimmen 2324577 98.1407
endgültiges Ergebnis WB 3406430 .
endgültiges Ergebnis Waehler 2368758 69.537
endgültiges Ergebnis u_erststimmen 43865 1.851
endgültiges Ergebnis g_erststimmen 2324893 98.148
;
run;
Proc Tabulate;
Class status / order = data;
Class gruppe / order = data;
Var absolut prozent;
Table
gruppe="",
status=""*(absolut*f=commax12. prozent*f=8.2)*sum=""
;
Run;
Das Ergebnis sieht dann so aus:
Und kann mit Labels und Formaten (bzw. korrekten Eingaben in den Daten) noch schöner gemacht werden.
Hoffe, das hilft weiter, viele Grüße,
Grischa Pfister
hallo Holger,
ich würde es eher mit Proc Report lösen - um die Proc Report kommt man ohnehin nicht herum und je eher man sich an sie gewöhnt, um so besser 😉
Data test2; length status $64 gruppe $16 absolut prozent 8; input status & gruppe absolut prozent; Cards; vorläufiges Ergebnis WB 3399454 . vorläufiges Ergebnis Waehler 2368615 69.676 vorläufiges Ergebnis u_erststimmen 44038 1.859 vorläufiges Ergebnis g_erststimmen 2324577 98.1407 endgültiges Ergebnis WB 3406430 . endgültiges Ergebnis Waehler 2368758 69.537 endgültiges Ergebnis u_erststimmen 43865 1.851 endgültiges Ergebnis g_erststimmen 2324893 98.148 ; run; proc report nowd; column gruppe status,(absolut prozent); define gruppe / group ""; define status / across ""; define absolut / format=commax12. "absolut"; define prozent / format=8.2 "%"; run;
viele Grüße. Heide
Hallo zusammen,
mit ODS lässt sich die Fragestellung natürlich ebenfalls lösen, hier sieht das Datenmodell dann wieder etwas anders aus, jede Spalte der Tabelle wird in einer eigenen Variable gespeichert, die Gruppierung verschwindet im Table Template:
Data Work.test2;
length gruppe $32 absolut_v prozent_v absolut_e prozent_e 8;
input gruppe & absolut_v prozent_v absolut_e prozent_e;
Cards;
Wahlberechtigte 3399454 . 3406430 .
Wähler 2368615 69.676 2368758 69.537
Ungültige Erststimmen 44038 1.859 43865 1.851
Gültige Erststimmen 2324577 98.1407 2324893 98.148
;
Run;
Proc Template;
Define Table gp.Report;
Column gruppe absolut_v prozent_v absolut_e prozent_e;
Header h1 h2;
Define h1;
start=absolut_v;
end=prozent_v;
Text "Vorläufiges Ergebnis";
End;
Define h2;
start=absolut_e;
end=prozent_e;
Text "Endgültiges Ergebnis";
End;
Define gruppe;
header = " ";
End;
Define absolut_v;
header = "Absolut";
format = commax10.;
End;
Define prozent_v;
header = "%";
format = 8.2;
End;
Define absolut_e;
header = "Absolut";
format = commax10.;
End;
Define prozent_e;
header = "%";
format = 8.2;
End;
End;
Run;
title;
footnote;
Options missing = " ";
Data _Null_;
Set Work.Test2;
File Print ods=(template="gp.report");
Put _ods_;
Run;
Options missing = ".";
Das Ergebnis sieht dann wieder so aus:
Wie immer in SAS gibt es viele Wege, das selbe Ergebnis herzustellen 😉
Viele Grüße,
Grischa
Hallo zusammen,
ich möchte mich ganz herzlich für die Lösungsvorschläge bedanken. Jeder der Vorschläge hat mir sehr geholfen und jetzt habe ich sogar die Qual der Wahl 😉
Viele Grüße
Holger
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!