【问题标题】:SAS Call SYMPUT - one macro variable, two values? (conditional)SAS Call SYMPUT - 一个宏变量,两个值? (有条件的)
【发布时间】:2019-01-07 16:14:12
【问题描述】:

我想创建一个名为“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 循环和第一个数据步骤很满意。这是我坚持的呼叫符号。 call symput 是否是正确的函数,可以为一个宏分配两个可能的值?

我将在 proc sql 中使用“currency_rate”的方式的 sn-p 示例:

    t1.income/&currency_rate.          

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

谢谢

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    让我们模拟您的情况。假设我们有3个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
    ;
    

    现在,让我们运行您的代码,并在其中为 currency_rate 赋值。

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

    %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
    

    让 i=3:

    %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
    

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

    【讨论】:

      【解决方案2】:

      你说你是一个初学者,所以最好的做法是在这一点上避免宏编程。了解wheremerge(或join)和by 语句会更好。

      您声明您需要在声明中使用currency_rate,例如

      t1.income / &currency_rate.
      

      t1. 对我来说表明 t1 是 SQL 联接中的别名,因此更有可能的情况是您需要离开联接表 t1,其中包含带有table1 的收入(称为monthly_datum)包含每月货币汇率。

      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 
      

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

      【讨论】:

        【解决方案3】:

        宏变量只能保存一个值。 由于您只分配了一个值,因此您可以轻松地使用 CALL SYMPUTX()。

         call symputx('currency_rate', currency_rate);
        

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

        【讨论】:

        • 感谢您的澄清!如果不是宏观变量,还有其他方法可以将这两个条件应用于一个“货币汇率”吗?两个不同的在我的查询中不起作用
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 2018-05-17
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多