LesezeichenAbonnierenRSS-Feed abonnieren
HPietschmann
Fluorite | Level 6

Hallo zusammen,

ich habe eine SAS-Tabelle mit folgenden WertenTabelle Wahlergebnis.PNG

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:

Kreuztabelle.PNG

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

 

 

4 ANTWORTEN 4
GrischaPfister
Fluorite | Level 6

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:

procTabulate.png

 

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

 

HeideTribius
Fluorite | Level 6

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

GrischaPfister
Fluorite | Level 6

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:

Ods.png

Wie immer in SAS gibt es viele Wege, das selbe Ergebnis herzustellen 😉

 

Viele Grüße,

 

  Grischa

HPietschmann
Fluorite | Level 6

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