Note :
Le Besoin : Automatiser PROC FREQ avec des métadonnées
L'utilisateur souhaite créer une macro %f_freq pour générer des tables de fréquences. Ses contraintes sont précises :
La sortie doit être une table de données (OUT=).
La variable doit être formatée (regroupement des valeurs).
Un label spécifique (souvent long) doit être attribué à la variable dans la table de sortie, défini au préalable via un %LET.
Le code problématique :
%let Q1_label='Texte très long pour la question 1...';
%macro f_freq(var, var_w, var_label);
proc freq data=clean_data order=freq;
table &var / out=freqout.freq_&var;
format &var &var_w;
label &var=&var_label; /* Assigne le label */
run;
%mend;
/* L'appel qui ne fonctionne pas comme prévu */
%f_freq(Q1, Q1_w., Q1_label);
1
%let Q1_label='Texte très long pour la question 1...';
2
3
%macro f_freq(var, var_w, var_label);
4
PROC FREQDATA=clean_data order=freq;
5
TABLE &var / out=freqout.freq_&var;
6
FORMAT &var &var_w;
7
label &var=&var_label; /* Assigne le label */
8
RUN;
9
%mend;
10
11
/* L'appel qui ne fonctionne pas comme prévu */
12
%f_freq(Q1, Q1_w., Q1_label);
Note :
L'Erreur : La résolution des variables macro (&)
Comme l'a souligné la réponse sur le forum, l'erreur ne se situe pas dans la définition de la macro, mais dans son appel.
L'utilisateur a écrit : %f_freq(Q1, Q1_w., Q1_label);
L'expert qui a répondu soulève un point technique intéressant : "Je pense que le format et le label sont utilisés pour l'affichage... Je ne pense pas qu'ils affectent l'agrégation."
Les Formats (FORMAT) : Ils affectent l'agrégation. Si vous appliquez un format qui regroupe les valeurs (par exemple, transformer 1, 2, 3 en "Petit"), PROC FREQ calculera la fréquence pour "Petit". C'est essentiel pour le recodage à la volée.
Les Labels (LABEL) : Ils n'affectent pas le calcul, mais ils sont cruciaux pour les métadonnées. L'instruction LABEL à l'intérieur de la procédure permet bien de stocker la description de la variable dans la table de sortie (OUT=).
Note :
Les bonnes pratiques de débogage
Pour éviter ce genre de confusion entre le nom d'une variable et son contenu, voici deux conseils tirés de la discussion :
Utiliser %PUT : Avant de lancer une procédure complexe, affichez les valeurs dans la journal (Log) pour vérifier ce que la macro reçoit vraiment.
%macro f_freq(var, var_w, var_label);
%put NOTE: La variable est &var;
%put NOTE: Le label reçu est &var_label;
/* ... reste du code ... */
%mend;
1
%macro f_freq(var, var_w, var_label);
2
%put NOTE: La variable est &var;
3
%put NOTE: Le label reçu est &var_label;
4
/* ... reste du code ... */
5
%mend;
Attention aux Quotes : Si votre label contient déjà des guillemets (comme défini dans %let Q1_label='...'), assurez-vous de ne pas en rajouter dans l'instruction label &var=&var_label;.
L'écriture de macros nécessite une rigueur particulière sur la portée des variables. Rappelez-vous toujours : si vous voulez passer le contenu d'une variable définie par un %LET, vous devez impérativement utiliser le préfixe & lors de l'appel.
Important Disclaimer
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.