1
votes

SAS Appel SYMPUT - une variable macro, deux valeurs? (conditionnel)

Je voudrais créer une macro appelée 'currency_rate' qui appelle la valeur correcte en fonction des conditions stipulées ("new_rate" ou valeur statique de 1,5):

    t1.income/&currency_rate.          

Je suis satisfait de la boucle do et de la première étape de données. C'est l'appel symput sur lequel je suis coincé. L'appel symput est-il la fonction correcte à utiliser pour attribuer deux valeurs possibles à une macro?

Un exemple d'extrait de la façon dont j'utiliserai 'currency_rate' dans un proc sql:

%macro MONEY;
%Do i=1 %to 5;

data get_currency_&i (keep=month code new_rate currency_rate);
set Table1;   
if month = &i and  code = 'USD' then currency_rate=new_rate;
else  currency_rate=1.5;
run;

data _null_;
set get_currency_&i;
if month = &i and  code = 'USD' then currency_rate=new_rate;
else  currency_rate=1.5;
call symput ('currency_rate', ???);
run;

%End;

%mend MONEY;

%MONEY

Je suis un utilisateur SAS de niveau débutant, tout conseil serait génial!

Merci


0 commentaires

3 Réponses :


0
votes

Une variable macro ne peut contenir qu'une seule valeur. Puisque vous n'attribuez qu'une seule valeur, vous pouvez facilement utiliser CALL SYMPUTX ().

 call symputx('currency_rate', currency_rate);

Mais si vos données ont plus d'une ligne, alors la valeur sera la dernière valeur définie dans l'ensemble de données.


1 commentaires

Merci d'avoir clarifié! Existe-t-il une autre façon d'appliquer ces deux conditions à un «taux de change», sinon à une macro-variable? Deux différents ne fonctionneraient pas dans mes requêtes



1
votes

Simulons votre cas. Supposons que nous ayons 3 ensembles de données , comme indiqué ci-dessous -

%let i=3;   /*Let's assign 3 to i*/
data _null_;
    set get_currency_&i;
    if month = &i and  code = 'USD' then currency_rate=new_rate;
    else  currency_rate=1.5;
    call symput ('currency_rate', currency_rate);
run;
%put Currency rate is: &currency_rate;
    Currency rate is:          2.5

Maintenant, exécutons votre code où nous attribuons une valeur à currency_rate .

Soit i = 1 Ainsi, l'ensemble de données get_currency_1 sera accédé. Au fur et à mesure que nous exécutons l'étape, chaque ligne sera accédée et la valeur de currency_rate sera affectée à la macro variable currency_rate et cette itération se poursuivra jusqu'à la fin de la étape de données. À ce stade, la dernière valeur sera de currency_rate sera la valeur finale de la variable macro currency_rate car au-delà, l'étape se termine.

%let i=1;   /*Let's assign 1 to i*/
data _null_;
    set get_currency_&i;
    if month = &i and  code = 'USD' then currency_rate=new_rate;
    else  currency_rate=1.5;
    call symput ('currency_rate', currency_rate);
run;
%put Currency rate is: &currency_rate;
    Currency rate is:          1.5

Soit i = 3:

data get_currency_1;
    input month code $ new_rate currency_rate;
cards;
1 USD 2 2
2 CHF 2 1.5
3 GBP 1 1.5
;
data get_currency_2;
    input month code $ new_rate currency_rate;
cards;
1 USD 3 1.5
2 USD 4 4
3 JPY 0.5 1.5
;
data get_currency_3;
    input month code $ new_rate currency_rate;
cards;
1 USD 1 1.5
2 USD 3 1.5
3 USD 2.5 2.5
;

Vous ne pouvez pas avoir plusieurs valeurs sur une variable macro.


0 commentaires

1
votes

Vous dites que vous êtes un débutant, donc le meilleur plan d'action est d'éviter la programmation macro à ce stade. Vous feriez mieux de découvrir les instructions , fusionner (ou joindre ) et by .

Vous déclarez que vous devrez utiliser un currency_rate dans une instruction telle que

select
  t1.income / coaslesce(monthly_datum.currency_rates,1.5)
, …
from
  income_data as t1
left join
  monthly_datum
on t1.month = monthly_datum.month 

Le t1. me suggère t1 est un alias dans une jointure SQL et donc le scénario beaucoup plus probable est que vous devez quitter la table de jointure t1 qui contient les revenus avec table1 (appelez it Monthly_datum) qui contient les taux de change mensuels.

t1.income / &currency_rate.

Le taux de 1,5 serait utilisé lorsque le revenu est associé à un mois qui n'est pas présent dans Monthly_datum. p >


0 commentaires