SAS9

Wie man Variablennamen bedingt extrahiert und verkettet

Simon 5 views

Im klinischen oder Marketing-Datenmanagement trifft man häufig auf Tabellen, in denen Informationen über mehrere Spalten verteilt sind. Eine häufige Aufgabe besteht darin, zu identifizieren, welche Spalten Daten für ein bestimmtes Individuum enthalten, und dann eine zusammenfassende Liste dieser Spaltennamen in einer einzigen Variablen zu erstellen.

Dieser Artikel erklärt, wie man die Funktionen ARRAY, VNAME und CATX in SAS© verwendet, um eine "breite" Struktur in eine verkettete beschreibende Liste umzuwandeln.

Wie man Variablennamen bedingt extrahiert und verkettet -

Das Problem

Stellen wir uns einen Datensatz vor, der Patienten-IDs und mehrere Spalten für verschiedene Studien enthält (Study1ID, Study2ID, usw.). Wenn ein Patient in einer Studie eingeschrieben ist, enthält die Spalte eine ID. Andernfalls ist sie leer oder fehlt.

Eingabedaten:

CurrentStudyStudy1IDStudy2IDStudy3IDStudy4ID
001180780.560
002.790.520
003...231

Gewünschtes Ergebnis:

Wir möchten eine neue Variable erstellen (z. B. Other_enrolled_studies), die die Namen der Studien auflistet, an denen der Patient teilnimmt, getrennt durch ein Komma.

CurrentStudyOther_enrolled_studies
001Study1ID, Study2ID, Study4ID
002Study2ID, Study4ID
003Study4ID

Die Lösung: Die Mächtigkeit von VNAME

Der Schlüssel zur Lösung dieses Problems liegt in der Funktion VNAME(). Im Gegensatz zu den meisten SAS©-Funktionen, die den Wert einer Variablen verarbeiten, gibt VNAME den Namen der Variablen selbst zurück.

In Kombination mit einer Schleife über ein Array (ARRAY) ermöglicht diese Funktion das dynamische Durchlaufen der Spalten.

Methode 1: Der iterative Ansatz (Empfohlen)

Diese Methode ist die direkteste und oft die effizienteste. Sie besteht darin:

  1. Ein ARRAY zu deklarieren, das alle relevanten Spalten zusammenfasst.

  2. Über dieses Array zu iterieren.

  3. Zu prüfen, ob der Wert nicht fehlt.

  4. Wenn ein Wert vorhanden ist, den Namen der Variablen (über VNAME) an unsere Ergebnisvariable anzuhängen.

1DATA want;
2 SET have;
3 LENGTH studies $200; /* Définir la longueur pour éviter la troncature */
4
5 /* 1. Déclarer un tableau regroupant les variables commençant par 'Study' */
6 array study(*) study: ;
7
8 /* 2. Boucler sur chaque élément du tableau */
9 DO i=1 to dim(study);
10 /* 3. Vérifier si la valeur n'est pas manquante */
11 IF not missing(study(i)) THEN DO;
12 /* 4. Concaténer le nom de la variable */
13 studies = catx(", ", studies, vname(study(i)));
14 END;
15 END;
16
17 drop i;
18RUN;

Schlüsselpunkte des Codes:

  • study:: Der Doppelpunkt ist ein Platzhalter (Wildcard), der alle Variablen auswählt, die mit dem Präfix "Study" beginnen.

  • catx(", ", ...): Diese Funktion ist ideal, da sie Trennzeichen automatisch verwaltet. Sie fügt kein Komma am Anfang der Zeichenkette hinzu, wenn diese leer ist, und entfernt unnötige Leerzeichen.

Methode 2: Der Ansatz mit parallelen Arrays

Eine andere Möglichkeit besteht darin, zwei Arrays zu verwenden: eines für die numerischen Werte und ein anderes, um die Namen als Zeichen zu speichern, und dann am Ende alles zu verketten.

1
 
1DATA want;
2 SET have;
3 /* Tableau des valeurs sources */
4 array var1(*) Study1ID Study2ID Study3ID Study4ID;
5 /* Tableau temporaire pour stocker les noms */
6 array var2(*) $32 Study1IDc Study2IDc Study3IDc Study4IDc;
7
8 DO i = 1 to dim(var1);
9 IF var1(i) ne . THEN var2(i) = vname(var1(i));
10 END;
11
12 /* Concaténation finale de tout le tableau de noms */
13 newvar = catx(',', of var2(*));
14
15 drop i Study1IDc Study2IDc Study3IDc Study4IDc;
16RUN;

Hinweis zur Leistung

Obwohl die zweite Methode funktioniert, kann sie bei sehr großen Datensätzen weniger leistungsfähig sein, wenn die Funktion catx innerhalb der Schleife platziert wird. Tatsächlich ist das Verketten der gesamten Liste bei jeder Iteration eine unnötig kostspielige Operation.

Wenn Sie den iterativen Ansatz (Methode 1) verwenden, bleibt die Verwendung von catx Zeile für Zeile, sobald die Bedingungen erfüllt sind, sehr effizient, da nur eine einzige Zeichenkette schrittweise aufgebaut wird.

Die gemeinsame Verwendung von ARRAY und VNAME bietet eine enorme Flexibilität für die Datenbereinigung ("Data Munging"). Dies ermöglicht es, die Struktur von Metadaten (die Spaltennamen) in verwertbare Daten (Zellenwerte) umzuwandeln, was besonders nützlich ist, um automatisierte zusammenfassende Berichte zu erstellen.