SAS-DATA-Step: ARRAY

R. Becker


    

Falls Sie gelegentlich mit SAS arbeiten und nicht wissen, was man mit einem ARRAY im DATA-Step so alles anfangen kann, sollten Sie unbedingt den folgenden Artikel lesen. Darin wird dargestellt, wie man mit ARRAYs SAS-Programme vereinfachen kann und wie man mit Hilfe von ARRAYs komplexe Programmiertechniken anwenden kann. Natürlich braucht man ARRAYs nicht immer, aber immer öfter!

Was ist ein ARRAY?

Der Begriff ARRAY (engl.: Ordnung, Reihe) hat innerhalb von Programmiersprachen oft die Bedeutung einer Zusammenfassung einer Reihe von Variablen. So kann man auch im SAS-DATA-Step mit dem ARRAY-Statement eine Reihe von Variablen zusammenfassen. Dies ist dann sinnvoll, wenn eine bestimmte Operation für mehrere Variablen identisch durchgeführt werden soll. In diesem Fall muß die Operation nicht für jede Variable einzeln, sondern kann einfach über das ARRAY ausgeführt werden.

Beispiel:
Angenommen, Ihre Daten enthalten 20 Variablen (fr1 - fr20), deren Werte mit 'j' (= ja) und 'n' (n = nein) abgespeichert wurden. Um mit den Werten rechnen zu können, möchten Sie 'j' in 1 und 'n' in 0 umwandeln. Ohne ARRAY wird Ihr SAS-Programm wie folgt aussehen:

Programm 1

 DATA neu;
    SET alt; 
    IF fr1='j' THEN frn1=1;
       ELSE frn1=0;
    IF fr2='j' THEN frn2=1;
       ELSE frn2=0;
    ......
    IF fr20='j' THEN frn20=1;
       ELSE frn20=0;
 RUN;


Mit Hilfe des ARRAY-Statements kann das Programm verkürzt werden auf:

Programm 2

 DATA neu;
    SET alt;
    ARRAY fr {20} fr1 - fr20;
    ARRAY frn {20} frn1 - frn20;
    DO i=1 TO 20;
       IF fr{i}='j' THEN frn{i}=1;
       ELSE frn{i}=0;
    END;
 RUN;


Das ARRAY-Statement

Da das ARRAY-Statement sehr unterschiedliche Funktionen erfüllen kann, können hier nicht alle Formen und Einsatzmöglichkeiten dargestellt werden. Eine ausführliche Beschreibung findet man in [1], S. 292-306 (!). SAS unterscheidet explizite und implizite ARRAYs wie folgt.

Explizit:

ARRAY name {n} var_1 ... var_n;
Implizit:

ARRAY name var_1 ... var_n;
Dabei bezeichnet 'name' den Namen des ARRAYs und 'n' die Anzahl der darin enthaltenen Variablen. Im Programm 2 wurde also die explizite Form gewählt. Das folgende Programm enthält die implizite Form:

Programm 3

 DATA neu;
    SET alt;
    ARRAY fr fr1 - fr20;
    ARRAY frn frn1 - frn20;
    DO OVER r;
       IF fr='j' THEN frn=1;
       ELSE frn=0;
    END;
 RUN;


Im Fall der impliziten Darstellung kann das DO OVER-Statement angewandt werden, da hier vollständig auf Indizes verzichtet werden kann.

Spezielle Möglichkeiten

Besonders interessant sind ARRAYs im Zusammenhang mit der Prozedur TRANSPOSE, bei der die Datenmatrix transpontiert (gekippt) wird: Die daraus entstandenen Spalten besitzen die Namen COL1-COLn (n = Anzahl der Beobachtungen), mit denen durch ein explizites ARRAY einfach gerechnet werden kann. Unter einem multidimensionalen ARRAY versteht man ein ARRAY, welches eine zwei- oder höherdimensionale Tabelle aufspannt. Syntay:

ARRAY name {n1,n2,...} variablen;
Im folgenden Beispiel liegen als Daten Schulnoten für 4 Fächer (f1-f4) in zwei Jahrgängen (jg1,jg2) vor:

     ARRAY note {2,4} jg1f1-jg1f4
                       jg2f1-jg2f4;
Im letzten Beispiel wird dargestellt, wie man mittels ARRAYs die Datenstruktur einfach verändern kann.

Vorher:

    AN    ON    MN    GN    AO
    1.2   1.7   2.3   1.8   1.2
    2.3   1.3   2.7   ...

Nachher:

    VARNAME   WERT   ...
       AN     1.2
       ON     1.7
       MN     2.3
    ...

Programm 4

  DATA data1;
     SET eins.zns;
     LENGTH varname $8;
     ARRAY merkm an on mn gn ao;
     DO OVER merkm;
        wert=merkm;
        CALL VNAME(merkm,varname);
        OUTPUT;
     END;
  SYMBOL1 V=DOT I=BOXT;
  PROC GPLOT DATA=data1;
     PLOT wert*merkm=1;
  RUN; QUIT;

Bemerkenswert in diesem Programm ist noch die CALL-Routine "VNAME", die den Namen der einen Variablen als Ausprägung einer anderen Variablen abspeichert. Durch die neue Datenstruktur lassen sich mit PROC GPLOT die Merkmale z.B. mit Box-Plots miteinander vergleichen.

Literatur:

[1] SAS Language, Reference, Version 6
    - S. 160-171
    - S. 292-306


Ansprechpartner im URZ:

Rainer Becker           Zimmer Ei: eO-106   CEO-Mail: becker
                        Tel.: -351          PMail: rainer.becker
Ingo Kemmerzell         Zimmer In: AS-301   CEO-Mail: kemmerzell 
                        Tel.: -249          PMail: ingo.kemmerzell