SAS9

Die Hierarchie der mehrstufigen Sortierung mit PROC SORT verstehen

Simon 5 Aufrufe

Einer der ersten Befehle, die man in der SAS©-Programmierung lernt, ist die PROC SORT. Während ihre Verwendung für eine einzelne Variable trivial erscheint, können die Ergebnisse Benutzer manchmal verwirren, wenn es darum geht, eine Sortierung nach drei oder mehr Kriterien anzuwenden.

Eine häufige Verwirrung tritt auf, wenn man versucht, eine Tabelle nach einer komplexen Logik zu sortieren, zum Beispiel: nach Stadt (aufsteigend), dann nach Schulden (absteigend) und schließlich nach Kontonummer (aufsteigend). Bei der Überprüfung des Ergebnisses stellt man oft fest, dass die letzte Variable (die Kontonummer) völlig ungeordnet erscheint.

Ist das ein Codefehler? Ein Bug in SAS©? Nein, es handelt sich lediglich um eine Fehlinterpretation der hierarchischen Sortierlogik.

Die Hierarchie der mehrstufigen Sortierung mit PROC SORT verstehen -

Das "Tie-Breaker"-Prinzip (Stichentscheid)

Um zu verstehen, warum Ihre dritte Variable nicht sortiert zu sein scheint, muss man sich die Sortierung als eine Reihe von Filtern oder russischen Puppen vorstellen.

Wenn Sie die folgende Anweisung übermitteln:

Note :
PROC SORT data=ma_table;
BY town DESCENDING debt accountnumber;
RUN;

SAS© versucht nicht, alle Spalten unabhängig voneinander zu sortieren. Es wendet eine strenge Hierarchie an:

  1. Ebene 1 (Town): SAS© sortiert zuerst den gesamten Datensatz nach Stadt.

  2. Ebene 2 (Debt): Die Sortierung nach Schulden wird nur innerhalb der Gruppen aktiviert, in denen die Stadt identisch ist. Es ist ein Stichentscheid-Kriterium.

  3. Ebene 3 (AccountNumber): Diese Sortierung wird nur dann sichtbar und wirksam, wenn die ersten beiden Kriterien (Stadt UND Schulden) für mehrere Beobachtungen streng identisch sind.

Die Illusion der Unordnung

Das Wahrnehmungsproblem rührt daher, dass in vielen realen Datensätzen die Kombination der ersten beiden Variablen oft einzigartig ist.

Stellen Sie sich eine Zeile vor, in der die Stadt "Paris" und die Schuld "500" ist. Wenn es keine andere Zeile mit genau "Paris" und "500" gibt, hat die Sortierung nach Kontonummer keine Gelegenheit, angewendet zu werden. Die Kontonummer erscheint also an der Position, die nur durch die ersten beiden Kriterien bestimmt wird. Wenn Sie die Spalte accountnumber von oben nach unten betrachten, ohne die anderen zu berücksichtigen, wird sie zufällig erscheinen.

Ein konkretes Beispiel

Nehmen wir einen konkreten Fall, um diese Funktionsweise zu veranschaulichen. Angenommen, wir haben mehrere Beobachtungen, aber die Sortierung nach Kontonummer ist nur für eine bestimmte Untergruppe wirksam:

  • Gruppe A (Town='Apex', Debt=50.00): Nur eine Zeile. Die Kontonummer wird so angezeigt, wie sie ist.

  • Gruppe B (Town='Apex', Debt=37.95): Es gibt drei Zeilen mit diesen exakten Werten.

  • Gruppe C (Town='Boston', Debt=100.00): Nur eine Zeile.

In diesem Szenario ist die Sortierung der Kontonummer (3. Variable) nur für die Gruppe B sichtbar. Wenn die Kontonummern für diese Gruppe 3131, 5108 und 9923 sind, werden sie tatsächlich in dieser aufsteigenden Reihenfolge erscheinen.

Wenn Sie jedoch die Kontonummer von Gruppe A visuell mit der von Gruppe B vergleichen, wird es keine offensichtliche Sortierlogik zwischen ihnen geben, da die höhere Hierarchie (die Schulden) Vorrang hatte.

Wenn Ihre dritte Sortiervariable ungeordnet erscheint, überprüfen Sie Ihre Daten. Es ist sehr wahrscheinlich, dass Sie nur sehr wenige Duplikate bei der Kombination der ersten beiden Variablen haben.

Die Sortierung funktioniert korrekt, aber ihre Wirkung wird durch die hohe Kardinalität der vorhergehenden Kriterien "maskiert". Die Sortierung nach der Variablen n ist nur nützlich, um bei Gleichständen der Variablen 1 bis n-1 zu entscheiden.