1
votes

Calculs simples dans les variables macro - comment utiliser la fonction MOD (,)?

Existe-t-il une manière intelligente d'utiliser la fonction MOD (,) lors de la définition des variables macro?

Par exemple, considérez ceci:

data _null_;
input_year=2015;
input_dec =mod(input_year,100);
%LET year=input_year;
%LET dec = input_dec;
put &dec. 'and ' &year.;
run;

dec ne contiendra que les deux derniers chiffres de l'année. Cela ne fonctionnera pas (la même chose avec SYSEVAL ), car la fonction % EVAL ne peut pas accéder correctement à la fonction MOD .

Je ne veux pas inclure de DATA STEP , mais le résultat devrait en fait être quelque chose comme ceci:

%LET year=2015;
%LET dec = %EVAL(mod(&year.,100));

Le problème ici est que le Les variables macro ne peuvent pas être appelées en dehors de la DATA STEP (peut-être ai-je fait quelque chose de mal? Même l ' option globale ne fait pas l'affaire).

Un peu de contexte:

Dans un fichier autoexec existant, l'utilisateur doit modifier certaines entrées, en fonction de l'année, toutes ensemble, 3 macro-variables doivent être adaptées (année, déc et année de suivi). Mon idée était de déduire les autres changements à partir d'une seule entrée, l'année.


0 commentaires

3 Réponses :


4
votes

% eval et % sysevalf sont utilisés pour faire des calculs sur des nombres, en dehors d'une étape de données. Lorsque vous utilisez des fonctions, vous avez besoin de %sysfunc

%LET year=2015;
%LET dec = %sysfunc(mod(&year.,100));

%put &=dec. and &=year.;


1 commentaires

Super, ça marche! Je ne sais pas pourquoi je n'ai pas repéré la fonction % sysfunc dès le début. Merci!



2
votes

Vous devez utiliser SYSFUNC () pour utiliser des fonctions dans la syntaxe de macro. SUBSTR fonctionnera également.

%let next_year = %eval(&year + 1);
%let next_year_index = %eval(&index + 1);

%put Next Year: &next_year.;
%put Next Year Index: &next_year_index;

% EVAL () fonctionne pour les calculs mathématiques, tels que:

%let year=2015;
%let index = %sysfunc(substr(&year, 3, 2));

%put &year;
%put &index.;


0 commentaires

0
votes

Reeza a fourni une belle solution qui est absolument correcte. Je l'étendrais par deux commentaires:
1. Vous pouvez trouver des fonctions comme% SUBSTR dans SAS, mais celles-ci fonctionnent uniquement sur les macrovariables ; ils ne remplacent pas % sysfunc (substr ()) , au contraire.
2. Il est utile de prendre une minute et de parcourir la liste des macrofonctions, c'est-à-dire celles qui commencent par le signe pour cent: vous verrez qu'à part% EVAL (), il y a aussi% SYSEVALF (). La liste est ici .


0 commentaires