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.
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 :
| CurrentStudy | Study1ID | Study2ID | Study3ID | Study4ID |
| 001 | 180 | 780 | . | 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.
| CurrentStudy | Other_enrolled_studies |
| 001 | Study1ID, Study2ID, Study4ID |
| 002 | Study2ID, Study4ID |
| 003 | Study4ID |
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 à :
Déclarer un ARRAY regroupant toutes les colonnes d'intérêt.
Boucler sur ce tableau.
Vérifier si la valeur n'est pas manquante.
Si une valeur existe, concaténer le nom de la variable (via VNAME) à notre variable de résultat.
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.
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.