PROC PRINT – Einfügen einer Leerzeile nach jeder x.ten Beobachtung

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Carina Ortseifen aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2010.

Die Ergebnisse der Prozedur PRINT sind bei großen Datenmengen nicht allzu übersichtlich. Etwas lesbarer wird die Ausgabe, wenn nach jeder 5., 10. oder allgemein n-ten Beobachtung eine Leerzeile eingefügt wird. Damit wird die Tabelle aufgebrochen und für das Auge werden Strukturen sichtbar. Am Beispiel der SAS-Tabelle SASHELP.CLASS könnte das wie folgt aussehen:

SAS-Tabelle SASHELP.CLASS
 Obs Name    Sex  Age Height Weight
  1   Alfred  M    14  69.0   112.5
  2   Alice   F    13  56.5    84.0
  3   Barbara F    13  65.3    98.0
  4   Carol   F    14  62.8   102.5
  5   Henry   M    14  63.5   102.5
  6   James   M    12  57.3    83.0
  7   Jane    F    12  59.8    84.5
  8   Janet   F    15  62.5   112.5
  9   Jeffrey M    13  62.5    84.0
  10  John    M    12  59.0    99.5
  11  Joyce   F    11  51.3    50.5
  12  Judy    F    14  64.3    90.0
  ..  ....

Der „steinige“ Weg

Dieses Ziel kann mit dem im Folgenden beschriebenen Trick erreicht werden. Zunächst werden in die Tabelle künstliche Beobachtungen, komplett mit fehlenden Werten ausgefüllt, dort eingefügt, wo später Leerzeilen erscheinen sollen.

* Der steinige Weg;
Data class_blanks;
     Set sashelp.class;
     Output; /* Output real observation */
     If Mod(_n_,5)=0;
     Array Allnums {*} _Numeric_ ;
     Array Allchar {*} _Character_ ;
     Drop i;
     Do i=1 To Dim(allnums); allnums{i}=.; End;
     Do i=1 To Dim(allchar); allchar{i}=' '; End;
     Output; /* Output blank observation */
Run;

Die erste OUTPUT-Anweisung überträgt die vorhandenen Beobachtungen in die neue Tabelle. Zusätzlich wird nach jeder 5. Beobachtung, berechnet mittels MOD(_N_,5)=0, mit einer zweiten OUTPUT Anweisung eine zusätzliche Beobachtung eingefügt. Die beiden Arrays und die DO-Schleife sorgen dafür, dass die numerischen und die Textvariablen mit fehlende Werte besetzt werden.

Damit die fehlenden numerischen Werte bei der anschließenden Ausgabe mit der Prozedur PRINT nicht auffallen, wird die Systemoption MISSING= verwendet.

Options Missing=' '; /* Display numeric missing as blank */
Title 'SAS-Tabelle SASHELP.CLASS - Der steinige Weg';
Proc Print Data=class_blanks Noobs;
Run;

Da zusätzliche Beobachtungen eingefügt wurden, stimmt die Spalte OBS nicht mehr mit den ursprünglichen Beobachtungszahlen überein und muss daher mittels der Option NOOBS auf jeden Fall unterdrückt werden. Wird dies alles beachtet, erzielt man das gewünschte Ergebnis. Ein wahrlich „steiniger Weg“ zum Ziel, der ab SAS 9.2 viel eleganter beschritten werden kann.

Der „elegante“ Weg mit SAS 9.2

Seit SAS 9.2 gibt es für dieses Problem eine sehr viel elegantere Lösung, die über eine einzige Option der PROC PRINT-Anweisung realisiert werden kann: BLANKLINE=.

* Die elegante Lösung;
Options Nodate Nonumber;
Title "SAS-Tabelle SASHELP.CLASS - Der elegantere Weg";
Proc Print Data=sashelp.class Blankline=5;
Run;

Unregelmäßige Leerzeilen

Die beiden vorgestellten Lösungen gehen davon aus, dass die Leerzeilen immer nach der gleichen Anzahl von Beobachtungen eingefügt werden sollen. Wie geht man aber vor, wenn die Anzahl nicht gleich ist, sondern unregelmäßige Abstände notwendig sind?


Die Option BLANKLINE= hilft da leider nicht weiter. Hier braucht man den (steinigen) Weg mit einem Datenschritt. Entweder mit den Steuervariablen FIRST.var/LAST.var und BY-Verarbeitung oder einem Array wie im folgenden Beispiel.

Options Missing = " ";
Data _null_;
  Attrib n length=8 format=4. label="Nobs";
  Set Sashelp.Class;
  n = _n_;
  Array breaks (3) _temporary_ (3,5,12);
  File Print Ods;
  Put _ods_;
  If ( n In breaks ) Then Put;
Run;

Das Array breaks enthält die Stellen für die Leerzeilen, also nach der 3., 5. und 12. Beobachtung. Dank ODS sieht das ganze dann so aus, als wäre es mit der Prozedur PRINT erzeugt:

Nobs    Name     Sex   Age  Height  Weight
   1    Alfred   M     14     69    112.5
   2    Alice    F     13   56.5       84
   3    Barbara  F     13   65.3       98 
   4    Carol    F     14   62.8    102.5
   5    Henry    M     14   63.5    102.5
   6    James    M     12   57.3       83
   7    Jane     F     12   59.8     84.5
   8    Janet    F     15   62.5    112.5
   9    Jeffrey  M     13   62.5       84
  10    John     M     12     59     99.5
  11    Joyce    F     11   51.3     50.5
  12    Judy     F     14   64.3       90
  13    Louise   F     12   56.3       77
  14    Mary     F     15   66.5      112
  15    Philip   M     16     72      150
  16    Robert   M     12   64.8      128
  17    Ronald   M     15     67      133
  18    Thomas   M     11   57.5       85
  19    William  M     15   66.5      112

Literatur

[1] Support-Website von SAS Institute: http://support.sas.com/kb/31/366.html