Data Step

SAS-Datentransformation: Von "Long" nach "Wide" Format und benutzerdefinierte Sortierungen

Simon 7 views

Bei der Datenbearbeitung in SAS© ist es häufig erforderlich, die Struktur einer Tabelle neu zu organisieren. Ein klassischer Fall ist die Umwandlung eines Datensatzes, in dem Kategorien zeilenweise aufgeführt sind ("Long"-Format), in ein Format, in dem diese Kategorien zu separaten Spalten werden ("Large"- oder "Wide"-Format).

Dieser Artikel erläutert, wie diese Transformation durchgeführt, Summen robust berechnet und eine komplexe Sortierlogik angewendet wird.

Das Szenario

Stellen Sie sich eine Quelltabelle namens Population1 vor, die demografische Daten nach Nation und Geschlecht enthält:

SAS-Datentransformation: Von "Long" nach "Wide" Format und benutzerdefinierte Sortierungen -

Ziel ist es, eine Tabelle Population2 zu erhalten, die wie folgt strukturiert ist, mit einer Spalte für die Gesamtzahl und separaten Spalten für jedes Geschlecht:

SAS-Datentransformation: Von "Long" nach "Wide" Format und benutzerdefinierte Sortierungen -

Schritt 1: Die Datentransposition

Obwohl es technisch möglich ist, einen komplexen DATA-Schritt mit RETAIN-Anweisungen und Bedingungen zu verwenden, basiert die effizienteste und fehlerunanfälligste Methode auf der TRANSPOSE-Prozedur.

Vor der Transponierung ist es zwingend erforderlich, die Daten nach der Gruppierungsvariablen (hier Nation) zu sortieren.

1/* 1. Tri préalable indispensable */
2PROC SORT DATA = population1;
3 BY Nation;
4RUN;
5 
6/* 2. Transposition */
7PROC TRANSPOSE DATA = population1 out = temp_pop(drop=_name_);
8 BY Nation; /* La ligne devient unique par Nation */
9 id Gender; /* Les valeurs de Gender deviennent les noms de colonnes */
10 var Number; /* Ce sont ces chiffres qui remplissent les colonnes */
11RUN;
An diesem Punkt enthält die Tabelle die Spalten Nation, Men und Women.
SAS-Datentransformation: Von "Long" nach "Wide" Format und benutzerdefinierte Sortierungen -

Schritt 2: Berechnung der Gesamtzahl und Handhabung fehlender Werte

Nachdem die Spalten erstellt wurden, müssen wir die Gesamtbevölkerung berechnen. Es gibt einen entscheidenden Unterschied zwischen einfacher arithmetischer Addition und der Summenfunktion in SAS©.

Der naive Ansatz

1Population = Men + Women;
Wenn eine der beiden Variablen (Men oder Women) einen fehlenden Wert (missing value) enthält, ist das Ergebnis der Operation ebenfalls fehlend.

Der empfohlene Ansatz

1Population = sum(Men, Women);
Die Funktion SUM() ignoriert fehlende Werte (behandelt sie als Nullen). Wenn Daten für Männer, aber nicht für Frauen verfügbar sind, zeigt die Gesamtsumme immer noch die Zahl der Männer anstelle eines Nullwerts, was im Allgemeinen das gewünschte Verhalten ist.

Schritt 3: Benutzerdefinierte Sortierung (Bedingte Logik)

Nehmen wir nun eine spezifische Sortierbedingung an:

  1. Sortieren Sie die Nationen nach absteigender Bevölkerungszahl.

  2. Ausnahme: Eine spezifische Nation (z.B. "MyCountry") muss unbedingt an letzter Stelle erscheinen, unabhängig von ihrer Bevölkerungszahl.

Um dies zu erreichen, ohne die angezeigten Daten zu ändern, besteht der Trick darin, eine temporäre Sortiervariable (oder "Rank") zu erstellen.

Die Logik

Wir weisen dieser Sortiervariablen den Bevölkerungswert für alle Nationen zu, außer für die Ausnahme, der wir einen künstlich niedrigen Wert zuweisen (z.B. -1).

1DATA population2;
2 SET temp_pop;
3
4 /* Calcul de la somme robuste */
5 Population = sum(Men, Women);
6 
7 /* Création de la variable de tri temporaire */
8 IF Nation = "MyCountry" THEN SortKey = -1;
9 ELSE SortKey = Population;
10RUN;
11 
12/* Tri final sur la clé temporaire */
13PROC SORT DATA = population2;
14 BY descending SortKey;
15RUN;
16 
17/* Nettoyage final : on retire la clé de tri */
18DATA population2;
19 SET population2(drop=SortKey);
20RUN;

Um eine Tabelle effizient zu transformieren:

  1. Verwenden Sie PROC SORT und anschließend PROC TRANSPOSE mit einer ID-Anweisung, um Zeilen in Spalten zu transponieren.

  2. Bevorzugen Sie die Funktion SUM() gegenüber dem Operator +, um die Verbreitung fehlender Werte zu vermeiden.

  3. Für komplexe Sortierungen (wie das Erzwingen einer Zeile am Ende der Tabelle) erstellen Sie eine temporäre technische Variable, sortieren Sie danach und löschen Sie sie dann.