SAS调用符号-一个宏变量,两个值? (有条件的)

时间:2019-01-07 16:14:12

标签: sas sas-macro

我想创建一个名为“ currency_rate”的宏,该宏根据规定的条件调用正确的值 (“ new_rate”或静态值为1.5):

%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

我对do循环和第一个数据步骤感到满意。这是我坚持的通话技巧。调用symput是使用正确的函数,将两个可能的值分配给一个宏吗?

我将在proc sql中使用“ currency_rate”的方式的片段示例:

    t1.income/&currency_rate.          

我是初学者SAS用户,任何指导都很棒!

谢谢

3 个答案:

答案 0 :(得分:1)

让我们模拟您的情况。假设我们有3个var chats = [ {id: 1, name: "James Anderson",read:false}, {id: 2, name: "James Anderson",read:true}, {id: 3, name: "James Anderson",read:true}, {id: 4, name: "James Anderson",read:true} ]; let result = chats.filter(t=>!t.read).length; console.log(result);,如下所示-

datasets

现在,让我们在为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 ; 分配值的地方运行代码。

让i = 1 因此,将访问数据集currency_rate。在执行该步骤时,将访问每一行,并将get_currency_1的值分配给宏变量currency_rate,并且此迭代将持续到数据步骤结束。此时,最后一个值将是currency_rate,将是宏变量currency_rate的最终值,因为超出此步将结束。

currency_rate

让我= 3:

%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

一个宏变量不能有多个值。

答案 1 :(得分:1)

您说您是一个初学者,所以最好的做法是避免此时进行宏编程。最好了解wheremerge(或join)和by语句。

您声明需要在诸如

之类的语句中使用currency_rate
t1.income / &currency_rate.

对我来说,t1.建议t1是SQL连接中的别名,因此,更可能的情况是您需要保留包含{{ 1}}(称它为Monthly_datum),其中包含每月的货币汇率。

t1

当收入与month_datum中不存在的月份相关联时,将使用1.5的比率。

答案 2 :(得分:0)

宏变量只能包含一个值。 由于只分配一个值,因此可以轻松使用CALL SYMPUTX()。

 call symputx('currency_rate', currency_rate);

但是,如果您的数据有多行,则该值将是数据集中的最后一个值。