Data Manipulation

SAS WHICHC et VNAME : Comment identifier et récupérer dynamiquement un nom de variable ?

Ce code est également disponible en : Deutsch English Español
Niveau de difficulté
Confirmé
Publié le :
Stéphanie

Le Conseil de l'Expert

Stéphanie
Spécialiste Machine Learning et IA.

L'identification de l'origine d'une valeur parmi plusieurs colonnes est un défi classique, notamment dans le secteur financier où les notations (ratings) proviennent d'agences concurrentes. Si les conditions IF-ELSE sont lisibles pour de petits volumes, l'utilisation de la fonction WHICHC offre une approche beaucoup plus élégante et performante. Cette fonction retourne l'index de la première colonne correspondant à la valeur cible. Coupler cet index avec un ARRAY et la fonction VNAME permet de récupérer dynamiquement le nom de la variable gagnante (ex: "moodys" ou "fitch") sans écrire de code en dur pour chaque agence.

Le script génère d'abord une table contenant des notations. Il compare ensuite une colonne cible 'rating' à trois colonnes d'agences (moodys, s_and_p, fitch). Plusieurs techniques sont présentées : des conditions IF-ELSE classiques, l'utilisation de la fonction WHICHC pour trouver l'index de la colonne correspondante, et une méthode avancée combinant WHICHC, ARRAY et VNAME pour récupérer dynamiquement le nom de la variable correspondante. Une étape finale met en garde contre le désalignement entre l'ordre des arguments de WHICHC et celui de l'ARRAY.
Analyse des données

Type : CREATION_INTERNE


Les données sont générées directement dans le code via des instructions d'affectation et OUTPUT.

1 Bloc de code
DATA STEP Data
Explication :
Création de la table 'ratings' contenant une valeur cible 'rating' et trois colonnes de comparaison ('moodys', 's_and_p', 'fitch').
Copié !
1DATA ratings;
2 LENGTH rating $4;
3 rating = 'A+';
4 moodys = 'Baa2';
5 s_and_p = 'BBB+';
6 fitch = 'A+';
7 OUTPUT;
8 rating = 'Aa3';
9 moodys = 'Aa3';
10 s_and_p = 'AAA';
11 fitch = 'AA-';
12 OUTPUT;
13 rating = 'c';
14 moodys = 'Aa3';
15 s_and_p = 'AAA';
16 fitch = 'AA-';
17 OUTPUT;
18 rating = 'D-';
19 moodys = 'Aa3';
20 s_and_p = 'D-';
21 fitch = 'D-';
22 OUTPUT;
23RUN;
2 Bloc de code
DATA STEP
Explication :
Première méthode de correspondance utilisant une structure conditionnelle IF-ELSE classique pour identifier la colonne correspondante.
Copié !
1DATA ratings_match;
2 SET ratings;
3 LENGTH rating_match $8;
4 
5 IF rating = moodys THEN rating_match = 'moodys';
6 ELSE IF rating = s_and_p THEN rating_match = 's_and_p';
7 ELSE IF rating = fitch THEN rating_match = 'fitch';
8 ELSE rating_match = 'no match';
9RUN;
3 Bloc de code
DATA STEP
Explication :
Utilisation de la fonction WHICHC pour retourner l'index (la position) de la première variable correspondante dans la liste fournie.
Copié !
1DATA ratings_match;
2 SET ratings;
3 /* WHICHC talar om variabelnumret man fr trff p, baserat p ordningen
4 man raddar upp variablerna i p samma stt som COALESCEC.
5 Finns bara trff i en variabel spelar ordningen ingen roll.
6 Prioordning (i de fall man fr trff p flera):
7 1. Moodys
8 2. S&P
9 3. Fitch */
10 variable_match_number = whichc(rating, moodys, s_and_p, fitch);
11RUN;
4 Bloc de code
DATA STEP
Explication :
Combinaison d'un ARRAY, de la fonction WHICHC et de la fonction VNAME. L'index retourné par WHICHC est utilisé pour accéder à l'élément du tableau, et VNAME récupère le nom de la variable source.
Copié !
1DATA ratings_match;
2 SET ratings;
3 LENGTH rating_match $8;
4 /* Array fr att peka p de tre variablerna med vrden,
5 mste ha samma ordning som WHICHC */
6 array rating_agency [3] moodys s_and_p fitch;
7
8 variable_match_number = whichc(rating, moodys, s_and_p, fitch);
9
10 /* Fr man trff i ngon variabel g vidare och plocka fram namnet p variabeln */
11 IF variable_match_number THEN rating_match = vname(rating_agency[variable_match_number]);
12 ELSE rating_match = 'no match';
13RUN;
5 Bloc de code
DATA STEP
Explication :
Démonstration d'un cas d'erreur logique : l'ordre des variables dans WHICHC diffère de l'ordre dans l'ARRAY, ce qui conduit à récupérer le mauvais nom de variable via VNAME.
Copié !
1/* ndrar ordningen p WHICHC och inte arrayen, blir helt tokigt.
2 r det lnga listor kan man med frdel speca ordningen i en
3 makrovariabel s man bara gr det 1 gng. */
4DATA ratings_match_error;
5 SET ratings;
6 LENGTH rating_match $8;
7 array rating_agency [3] moodys s_and_p fitch;
8
9 variable_match_number = whichc(rating, s_and_p, fitch, moodys);
10
11 IF variable_match_number THEN rating_match = vname(rating_agency[variable_match_number]);
12 ELSE rating_match = 'no match';
13RUN;
L'Astuce Pro
Pour garantir une synchronisation parfaite et sans erreur entre votre fonction WHICHC et votre ARRAY, utilisez une macro-variable unique contenant la liste des colonnes (ex: %let agences = moodys s_and_p fitch;). Appelez-la ensuite dans l instruction ARRAY (array rating_agency [3] &agences;) et utilisez la fonction WHICHC(rating, &agences) avec une virgule comme separateur via la fonction %sysfunc(translate(&agences,%str(,),%str( ))). Cette methode automatise l alignement des index, ce qui est crucial puisque la fonction VNAME retournera un nom errone si l index de correspondance de WHICHC ne correspond pas strictement a la position de la variable dans l ARRAY.
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.

Documentation liée

Aucune documentation spécifique pour cette catégorie.