Je suis confronté à ce problème avec SAS Data Step. Mon exigence est d'obtenir une liste de variables telles que
Data final4; set final3; by hh_no; do i=0 to &tot_bal_mnth.; bal_mnth = put(intnx('month',"&min_Completed_dt."d, i-1), monyy7.); call symputx('bal_mnth', bal_mnth); &bal_mnth._total=sum(&bal_mnth., Dep_&bal_mnth.); output; end;
3 Réponses :
Ceci est un problème courant lors de l'apprentissage de la macro SAS. Le problème est que le processeur macro doit résoudre Dans ce cas, vous n'avez pas besoin My proposé & bal_mnth code> à une valeur lorsque l'étape de données est d'abord soumise à exécution, mais l'appel Sonpace n'exécute pas tant que l'étape de données est réellement exécutée, donc à la Heure que vous soumettez le code, il n'y a pas de valeur disponible pour
& bal_mnth code>. p>
BAL_MNTH CODE> Pour être créé en tant que variable dans l'ensemble de données, vous pouvez donc remplacer la ligne qui démarre
BAL_MNTH = METT (INTCK (... ))) code> avec un
% let Bal_mnth = ... Code> Déclaration. Le
laisse code> exécute alors que l'étape de données est soumise, de sorte que sa valeur sera disponible lorsque vous en avez besoin. P>
% Let CODE> L'instruction devra envelopper les fonctions dans au moins un SYSFONCC Appel, qui reste comme exercice pour le lecteur: -) P>
On dirait que vous souhaitez générer une série d'instructions d'affectation telles que: Qu'est-ce que l'on appelle fond d'écran strong> code. p> si Vos noms de variables étaient plus faciles, tels que Vous pouvez créer une macro afin que vous puissiez utiliser un ou vous pouvez simplement générer le code dans un fichier avec une étape de données. p> de sorte que le fichier généré de code ressemble à ceci: p> Vous pouvez ensuite utiliser dep1 code> à
dep18 code>, il serait alors facile d'utiliser des tableaux pour traiter les données. Avec votre convention de dénomination actuelle, le problème de générer les instructions de tableau n'est pas très différent du problème de générer une série de déclarations d'affectation. P>
do code> boucle pour générer votre code de papier peint. p>
%% inclure < / code> Pour l'exécuter dans votre étape de données. p>
Je voudrais offrir un autre point de vue: la difficulté que vous rencontrez ici résulte de l'utilisation d'une forme de données large, avec de nombreuses colonnes. P>
Plutôt que de travailler avec vos données dans cette forme, vous pouvez d'abord transposer de manière large à longue, de sorte que, au lieu d'avoir beaucoup de Lecture suggérée: P>
Transposer de large à longs avec des variables dynamiques P> TOTAL_XXX CODE> Colonnes, vous avez simplement 3:
Total Code >,
total_dep code> et
date code>, avec une ligne par mois. Une fois que c'est dans ce format, il sera beaucoup plus facile de travailler avec, ce qui vous permettra de vous permettre d'éviter de recourir à des macros et au code de papier peint. P>
Vous ne pouvez pas modifier le code d'une étape de données après son démarrage en cours d'exécution. Donc, votre instruction Call Synut () n'aura aucun impact sur le code exécuté pour l'étape de données actuelle.
Savez-vous quelles variables sont dans votre jeu de données source? Est-ce une liste constante? Ou ça change? Si oui, comment ça change?