PROC FORMAT

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

PROC FORMAT ist eine im Modul Base SAS enthaltene SAS-Prozedur. Sie dient zum Definieren von SAS-Formaten, die zum formatierten Einlesen oder Ausgeben von SAS-Variablen benutzt werden können.

Beitrag: Einführung in die Prozedur FORMAT mit praktischen Anwendungen

Einleitung und Beispieldatensatz

Formate und Informate sind im Vergleich zu anderen Statistikprogrammen ein herausragendes Alleinstellungsmerkmal der SAS-Software. Sie dienen dazu, Werte beim Lesen aus bzw. beim Schreiben in SAS-Variablen umzuwandeln. Damit lassen sich zum einen Nicht-Standardwerte, wie Texte mit mehr als 8 Zeichen oder Datumswerte in SAS-Tabellen abspeichern, aber auch Werte in anderer Form anzeigen, z.B. Komma statt Punkt als Dezimaltrennzeichen, Messwerte mit Maßeinheit (1,25 m) bzw. einfache Gruppierungen durchgeführt werden.

In diesem Beitrag werden die grundlegenden Anweisungen vorgestellt und anhand kleiner Beispiele der Einsatz der Prozedur FORMAT gezeigt. Der Leser erfährt, wo Formate und Informate eingesetzt werden können, wie eigene Formate definiert, wo diese gespeichert werden und wie sich das ganze mit Hilfe von SAS-Tabellen automatisieren lässt.

Die Anweisung FORMAT

Der Beispieldatensatz: Klasse

Mit dem folgenden Datenschritt erzeugen wir eine SAS-Tabelle namens klasse, die – der Einfachheit wegen – in der Bibliothek WORK abgelegt wird.

Data klasse;
Informat Name Vorname $20. Gebdaten Ddmmyy10.;
Input Name Vorname Geschlecht Groesse Note Gebdatum;
Datalines;
Bauer Natalie 1 1.56 2.0 01.01.1960
Graf Jochen 2 1.67 1.3 06.09.1996
Metzger Jürgen 2 1.80 2.7 21.02.1995
Schäfer Inga 1 1.71 3.0 30.06.1996
Walter Maike 1 1.66 1.7 23.11.1995
Bletzer Jörg 2 1.87 2.3 30.03.1995
;

Bereits in diesem Datenschritt werden Informate verwendet: $20. und DDMMYY10.. $20. für die Vor- und Nachnamen und DDMMYY10. für das Geburtsdatum der Schüler. Die Zuweisung der Informate zu den drei Variablen Name, Vorname und Gebdaten erfolgt mit der Anweisung INFORMAT. (Die übrigen Variablen werden mit dem Standard eingelesen und benötigen kein Extra-Informat.) Alternativ könnte man auch die Anweisung ATTRIB verwenden:

Data klasse;
 Attrib name vorname Informat=$20. gebdaten Informat=ddmmyy10.;
 Input name Vorname Geschlecht Groesse Note Gebdaten;
...

Die Anweisung ATTRIB ist dann von Vorteil, wenn nicht nur das Informat festgelegt werden soll, sondern auch Formate, Längen und andere Variablenmerkmale. Es gibt noch eine dritte Variante, die hier auch erwähnt werden sollte, da sie in der Literatur sehr häufig zu finden ist: Angabe des Formats direkt in der Anweisung INPUT:

Data klasse;
  Input Name :$20. Vorname :$20. Geschlecht Groesse Note
      Gebdatum :ddmmyy10.;´

Direkt im Anschluss an den Variablennamen werden die Informate übergeben. Vor der Informat-Angabe ist hier zusätzlich noch ein Doppelpunkt notwendig. Mit diesem Doppelpunkt wird die Länge des Informats als Maximalwert definiert. D.h. die tatsächliche Länge kann kürzer sein (z.B. fünf Zeichen bei „Bauer“).

Ganz gleich, welche der drei Varianten Sie vorziehen, Informate werden immer dann benötigt, wenn keine Standardwerte vorliegen. Standardtextwerte sind höchstens 8 Zeichen lang. Die Vor- und Nachnamen der Schüler können dagegen mehr Zeichen haben, daher sind hier die Informate notwendig. Für Datumsangaben benötigt man immer Informate (und Formate, vgl. dazu das folgende Beispiel und Abschnitt 3), denn als Zahlenwert enthält das Datum zu viele Punkte. (Würde man das Datum nur als Text abspeichern, würde der Informationsgehalt der Datumsangabe verloren gehen.)

Die Namen der Informate als auch die Namen der Formate beginnen stets mit einem $- Zeichen, wenn sie für Werte von Textvariablen verwendet werden ($20.). Formate und Informate für numerische Variablen haben kein $-Zeichen (10.2, DDMMYY10.). Der Zahlenwert 20 nach dem $-Zeichen bzw. 10 nach DDMMYY bezeichnet die Länge des formatierten Wertes. Vor- und Nachname können 20 Zeichen lang sein, das Datum 10 Zeichen. (Die Punkte zur Abtrennung von Tag, Monat und Jahr zählen mit und das Jahr ist vierstellig.)

Im SAS-Code sind die Formatnamen durch den Punkt gekennzeichnet. Dieser steht meistens an dessen Ende ($20., DDMMYY10.). Bei numerischen Formatbezeichnungen kann nach dem Punkt allerdings noch ein Zahlenwert folgen, der die Nachkommastellen bezeichnet, wie z.B. 10.2 für numerische Werte mit zwei Dezimalstellen.

Die Ausgabe der neuen SAS-Datei work.klasse mit der Prozedur PRINT sieht wie folgt aus:

Format20.JPG

Als Geburtsdatum gibt SAS jetzt nicht die ursprünglich eingetragenen Daten aus, sondern die intern gespeicherten, seit dem 1.1.1960 vergangenen Tage. (Daher auch die 0 in Zeile 1 bei Natalie Bauer.) Ein für uns lesbares Datum erscheint erst dann, wenn wir mittels der Anweisung FORMAT ein passendes Format verwenden.

Die Prozedur Format

Die Anweisung FORMAT

Formate werden mit Hilfe der Anweisung FORMAT in einem Daten- oder einem Prozedurschritt einer Variablen zugewiesen. Die ursprünglichen Werte der Variablen werden dadurch nicht verändert, aber die Erscheinungsform der Werte an das Format angepasst. Die allgemeine Syntax dieser lokalen Anweisung FORMAT lautet:

 Format variablenname formatname.;

Für unsere Beispieldatei können wir mit der Prozedur PRINT eine besser lesbare Liste erzeugen, wenn wir ein Datumsformat verwenden, hier DDMMYYP10., „P“ für den Punkt zur Abtrennung, im Unterschied zum Standardtrennzeichen „/“. Außerdem wenden wir gleich noch zwei weitere Formate an: $5. für die Variable Vorname und COMMAX10.2 für die Größe.

 Var name vorname groesse gebdatum;
 Format vorname $5. groesse COMMAX10.2 gebdatum DDMMYYP10.;
 Run;


Im Ausgabefenster sieht das Ergebnis dann wie folgt aus:

SAS-Format30.JPG

In der Online-Hilfe finden Sie über das Menü Help > SAS Help and Documentation unter SAS Products > Base SAS > SAS 9.2 Language Reference: Dictionary … > Dictionary of Language Elements > Formats bzw. Informats die Liste aller zur Verfügung stehenden Formate und Informate. Tabelle:

Formate im Daten- oder Prozedurschritt zuweisen?

Die Zuweisung von Informaten kann nur im Datenschritt erfolgen, wenn Daten in SASTabellen geschrieben werden. Daher können sowohl die ATTRIB- als auch die INFORMAT-Anweisung nur im Datenschritt stehen, genau wie INPUT. Die FORMATAnweisung dagegen kann sowohl im Daten- als auch im Prozedurschritt ausgeführt werden. In obigem Beispiel hatten wir FORMAT im PROC PRINT-Schritt eingesetzt. Die Variablen Vorname, Groesse und Gebdatum wurden in der angegebenen Form ausgegeben. Würden wir den Prozedurschritt ohne die Anweisung FORMAT wiederholen, kämen wieder die alten, unformatierten Werte zum Vorschein. Denn die Formatierung wurde nur im ersten, nicht aber im zweiten Prozedurschritt durchgeführt. Möchte man die Formatierung permanent setzen, muss die Zuweisung im Datenschritt erfolgen. Entweder gleich im Datenschritt, mit dem die Tabelle klasse angelegt wird:

  Data klasse;
  Informat Name Vorname $20. Gebdaten Ddmmyy10.;
  Format vorname $5. Gebdaten Ddmmyy10.;
  Input Name Vorname Geschlecht Groesse Note Gebdatum; ...

Oder in einem separaten Datenschritt:

  Data klasse;
  Set klasse;
  Format vorname $5. Gebdaten Ddmmyy10.;
  Run;

Damit wird das Format fest in der SAS Tabelle abgelegt und ist für jeden anschließenden Daten- und Prozedurschritt verfügbar.

Anzeige der Variablen-Eigenschaften im Properties-Fenster des SAS Explorer

Anzeige der Variablen-Eigenschaften im Properties-Fenster des SAS Explorer

Kontrollieren kann man die Eintragung im Properties-Fenster des SAS-Explorers. (Dazu im SAS-Explorer die Bibliothek Work öffnen, mit der rechten Maustaste auf das Symbol der Tabelle klasse klicken und View Columns auswählen.)


Klassenbildung mit Formaten

Die Formate können wir aber nicht nur für Listenberichte einsetzen, sondern auch zur Bildung von Klassen. Für die Vorbereitung des KSFE-Tagungsbüros sollten die Buchstaben festgelegt werden, nach denen die drei Schalter bestimmt werden, möglichst gleichmäßig. Es sollte also eine Klassierung der angemeldeten Konferenzteilnehmer nach dem Anfangsbuchstaben deren Nachnamen vorgenommen werden. Auszählen, auch kumulativ, erledigt die Prozedur FREQ, klassieren können wir mit dem passenden Format, und alles in einem Prozedurschritt:

  Proc Freq Data=work.klasse;
  Tables name;
  Format name $1.;
  Run;


Im Ausgabefenster erhalten wir:

SAS-Format32b.jpg

Weitere Anwendungen können im deutschsprachigen SAS-Wiki nachgelesen werden unter de.saswiki.org, Suche nach Format.

Die bislang verwendeten Formate sind alles SAS-eigene Formate. Für die Kodierung der Variable Geschlecht (1 für weiblich, 2 für männlich) liegt leider kein passendes Format vor. Dieses muss erst mit der Prozedur FORMAT definiert werden.


Weitere Optionen der Prozedur Format

Die Prozedur Format

Die Prozedur Format bietet dem Anwender die Möglichkeit, neue/eigene Formate zu definieren, beispielsweise für die Variablen Geschlecht und Note. Im Prozedur FORMAT- Schritt setzt man dazu die Anweisung VALUE ein. Mit der Anweisung PICTURE werden ebenfalls Formate definiert, allerdings da, wo es darum geht, Zahlen in bestimmter Form, wie z.B. Telefonnummern oder Längen mit Maßeinheit auszugeben.

Die allgemeine Syntax der Prozedur FORMAT lautet:

Proc Format <Optionen>;
  Value ...;
  Picture ...;
Run;

Die Anweisung VALUE

Für die SAS Tabelle klasse werden wir jetzt zwei Formate definieren: gender, um die Werte 1 und 2 der Variable Geschlecht zu erklären, und note, um die Noten im Klartext auszugeben. Das Format gender weist jedem Wert einen neuen Wert zu: 1 wird zu weiblich, 2 zu männlich. Bei dem Format note dagegen wird einem Wertebereich ein neuer Wert zugewiesen, beispielsweise Werte zwischen 0.7 und 1.3 werden zu „sehr gut“.

Dem Schlüsselwort VALUE folgt zunächst der Formatname, bei Textformaten muss dieser mit $ beginnen. Anschließend wird der alte Wert bzw. der alte Bereich angegeben und gefolgt von einem Gleichheitszeichen der neue Wert. Unser Beispiel lautet dann:

Proc Format;
   Value gender 1 = "weiblich"
                2 = "männlich";
Value note      Low-<1.5='sehr gut'
                1.5-<2.5='gut'
                2.5-<3.5='befriedigend'
                3.5-<4.5='ausreichend'
                4.5-<5.5='mangelhaft'
                5.7-High='ungenügend';
Run;

LOW und HIGH in der Definition des Formats Note bezeichnen den kleinsten bzw. größtmöglichen Wert.

Wir nutzen die neu definierten Formate nun in einem Listenbericht:

Proc Print Data=klasse;
   Var name vorname geschlecht note;
   Format geschlecht gender. note note.;
Run;

Und erhalten folgende Darstellung:

Format41.JPG

Die Anweisung PICTURE

Während man mit der Anweisung VALUE Wertebereichen oder Einzelwerten neue Werte zuweist, bietet die Anweisung PICTURE die Möglichkeit, die Form von Zahlenwerten festzulegen. So kann beispielsweise eine Größeneinheit wie „m“ (für Meter) an die Körpergröße angefügt werden, das $- oder €-Zeichen kann vor einem Geldbetrag angezeigt werden, führende Nullen lassen sich ausgegeben, z.B. bei numerisch kodierten Postleitzahlen, oder Telefonnummern lesbar formatieren (siehe auch [5]).

Wir werden für unsere Beispieldatei die Variable groesse mit einem entsprechenden Format belegen. Dazu formulieren wir folgende Picture-Anweisung in einem PROC FORMAT-Schritt:

Proc Format;
     Picture groesse Low-High='009.99 m';
Run;

Der Formatname lautet groesse. Die Definition gilt für den gesamten Wertebereich, also: „Low-High“. Nach dem Gleichheitszeichen erfolgt in Anführungszeichen eine Kombination von Nullen und Neunen. Diese geben die Stellen an, die ausgegeben werden. „0“ wird nur ausgegeben, wenn vorhanden, „9“ wird immer ausgegeben, d.h. die Werte werden immer mit zwei Nachkommastellen dargestellt. Das Leerzeichen und „m“ geben die Maßeinheit an, hier: Meter.

In Form eines Listenberichts

Proc Print Data=klasse;
  Var name vorname groesse;
  Format groesse groesse.;
Run;

zeigt sich das dann wie folgt:


Format42.JPG

Der durch das Picture-Format definierte Wert kann eine Länge von bis zu 40 Zeichen annehmen.

Die Option PREFIX= (die Option muss hierbei in Klammern gesetzt werden) gestattet die Einfügung von Zeichen vor dem eigentlichen Wert. Auch hierzu ein Beispiel:

Proc Format;
     Picture groesse Low-High='009.99' (Prefix="(in Metern) ");
Run;

Liefert im Listenbericht (gleicher Prozedurschritt wie im vorherigen Beispiel):

Format42b.JPG

Weitere hilfreiche Optionen der PICTURE Anweisung sind ROUND und MULT=. ROUND rundet den Wert auf den nächsten ganzzahligen Wert (ab 0,5 wird aufgerundet, ansonsten abgerundet), MULT=n oder MULTIPLIER=n bezeichnet den Faktor, mit dem der Wert multipliziert wird. Also n=3 bedeutet, dass der Wert mit 103 multipliziert wird. ROUND und MULT= werden vor dem Formatieren angewandt, d.h. erst wird gerundet bzw. multipliziert, dann die mittels Picture definierte Form angewendet. Für Beispiele siehe Shoemaker.


Geschachtelte Formate

Bei der Definition neuer Formate können im Label-Teil der Anweisung VALUE anstelle einzelner Werte mit Hilfe von eckigen Klammern bereits vorhandene Formate benannt werden.

Im folgenden Beispiel wird das Format gebgruppen definiert.

Proc Format;
   Value gebgruppen
   . = "k.A."
   Low-"31dec1990"d = [Year4.]
   "01jan1991"d-High = [Monyy7.];
Run;

Fehlende Werte werden damit als „k.A.“ (für keine Angabe) dargestellt, Datumsangaben bis zum 31. Dezember 1990 mit der Jahreszahl (ausgedrückt mit Hilfe des Formats Year4.), und Datumsangaben ab dem 1. Januar 1991 mit Monat und Jahresangabe (Format Monyy7.). Für unsere Beispieldatei sieht der Listenbericht mit

Proc Print Data=klasse;
   Format gebdatum gebgruppen.;
   Var vorname name gebdatum;
Run;

dann wie folgt aus:

Format43.JPG

Quellen

Weblinks