我想创建一个名为“ 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/¤cy_rate.
我是初学者SAS用户,任何指导都很棒!
谢谢
答案 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: ¤cy_rate;
Currency rate is: 1.5
一个宏变量不能有多个值。
答案 1 :(得分:1)
您说您是一个初学者,所以最好的做法是避免此时进行宏编程。最好了解where
,merge
(或join
)和by
语句。
您声明需要在诸如
之类的语句中使用currency_rate
t1.income / ¤cy_rate.
对我来说,t1.
建议t1
是SQL连接中的别名,因此,更可能的情况是您需要保留包含{{ 1}}(称它为Monthly_datum),其中包含每月的货币汇率。
t1
当收入与month_datum中不存在的月份相关联时,将使用1.5的比率。
答案 2 :(得分:0)
宏变量只能包含一个值。 由于只分配一个值,因此可以轻松使用CALL SYMPUTX()。
call symputx('currency_rate', currency_rate);
但是,如果您的数据有多行,则该值将是数据集中的最后一个值。