SAS9

Comment extraire et concaténer des noms de variables conditionnellement

Simon 7 vistas

Dans la gestion de données cliniques ou marketing, il est fréquent de rencontrer des tables où l'information est dispersée sur plusieurs colonnes. Une tâche courante consiste à identifier quelles colonnes contiennent des données pour un individu donné, puis à créer une liste récapitulative de ces noms de colonnes dans une seule variable.

Cet article explique comment utiliser les fonctions ARRAY, VNAME et CATX sous SAS© pour transformer une structure "large" en une liste descriptive concaténée.

Comment extraire et concaténer des noms de variables conditionnellement -

Le Problème

Imaginons un jeu de données contenant des identifiants de patients et plusieurs colonnes correspondant à différentes études (Study1ID, Study2ID, etc.). Si un patient est inscrit à une étude, la colonne contient un ID. Sinon, elle est vide ou manquante.

Données en entrée :

CurrentStudyStudy1IDStudy2IDStudy3IDStudy4ID
001180780.560
002.790.520
003...231

Résultat souhaité :

Nous voulons créer une nouvelle variable (par exemple Other_enrolled_studies) qui liste les noms des études auxquelles le patient participe, séparés par une virgule.

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

La Solution : La puissance de VNAME

La clé pour résoudre ce problème réside dans la fonction VNAME(). Contrairement à la plupart des fonctions SAS© qui traitent la valeur d'une variable, VNAME renvoie le nom de la variable elle-même.

Combinée avec une boucle sur un tableau (ARRAY), cette fonction permet de parcourir dynamiquement les colonnes.

Méthode 1 : L'approche itérative (Recommandée)

Cette méthode est la plus directe et souvent la plus efficace. Elle consiste à :

  1. Déclarer un ARRAY regroupant toutes les colonnes d'intérêt.

  2. Boucler sur ce tableau.

  3. Vérifier si la valeur n'est pas manquante.

  4. Si une valeur existe, concaténer le nom de la variable (via VNAME) à notre variable de résultat.

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;

Points clés du code :

  • study: : Le deux-points est un caractère générique (wildcard) qui sélectionne toutes les variables commençant par le préfixe "Study".

  • catx(", ", ...) : Cette fonction est idéale car elle gère automatiquement les séparateurs. Elle n'ajoute pas de virgule au début de la chaîne si celle-ci est vide, et elle supprime les espaces inutiles.

Méthode 2 : L'approche par tableaux parallèles

Une autre façon de faire consiste à utiliser deux tableaux : un pour les valeurs numériques et un autre pour stocker les noms sous forme de caractères, puis à tout concaténer à la fin.

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;

Note sur la performance

Bien que la seconde méthode fonctionne, elle peut être moins performante sur de très grands jeux de données si la fonction catx est placée à l'intérieur de la boucle. En effet, concaténer l'ensemble d'une liste à chaque itération est une opération coûteuse inutilement.

Si vous utilisez l'approche itérative (Méthode 1), l'utilisation de catx ligne par ligne au fur et à mesure que les conditions sont remplies reste très efficace car on ne construit qu'une seule chaîne de caractères progressivement.

L'utilisation conjointe de ARRAY et VNAME offre une flexibilité énorme pour le nettoyage de données ("Data Munging"). Cela permet de transformer la structure des métadonnées (les noms des colonnes) en données exploitables (valeurs de cellules), ce qui est particulièrement utile pour générer des rapports récapitulatifs automatisés.