如何在SAS中循环解析宏变量

时间:2016-12-18 19:57:38

标签: loops macros sas datastep

我试图弄清楚如何在SAS中的数据步骤中调用循环中的宏变量,但我迷路了;所以我有14个宏变量,我必须将它们中的每一个与向量的条目进行比较。我试过了:

for x in lst: 
    if result[x[0]] < x[1]: 
        result[x[0]] = x[1]

list(result.items())
# [(625, '2011-12-01'), (587, '2015-01-01')]

但它不起作用。变量vv1直到vv3是日期变量。例如,此代码有效:

data work.calendrier;
set projet.calendrier;
do i=1 to 3;
if date= "&vv&i"D then savinglight = 1;
end;
run; 

但是使用循环它无法解析宏变量。

3 个答案:

答案 0 :(得分:0)

如果你想引用一个像vv1,vv2,vv3这样的数字索引的宏变量,你需要先解决&amp; i。

SAS有一个单独的宏处理器,可以在值到达数据步骤处理器之前解析它。

基本上,您需要在宏变量的开头添加额外的&符号:

&&vv&i -> &vv1 -> "Value of vv1"
&&vv&i -> &vv2 -> "Value of vv2"
&&vv&i -> &vv3 -> "Value of vv3"

这里发生的是SAS在&符号之后读取信息,直到它找到休息时间。 SAS然后解决&amp;&amp;作为单个&amp ;,然后它继续读取直到它解析&amp; i作为数值。然后,您将获得所需的&amp; vvi变量。

关于这个有趣主题的几个消息来源:

http://www2.sas.com/proceedings/sugi29/063-29.pdf http://www.lexjansen.com/nesug/nesug04/pm/pm07.pdf

答案 1 :(得分:0)

在SAS编译和运行数据步骤之前解析宏变量引用。您需要首先弄清楚如何使用SAS语句执行您想要的操作,然后,如有必要,您可以使用宏代码来帮助您生成这些语句。

如果您想测试变量的值是否与值列表中的某个匹配,请考虑使用IN运算符。

data work.calendrier;
  set projet.calendrier;
  savinglight = date in ("&vv1"d,"&vv2"d,"&vv3"d);
run; 

答案 2 :(得分:0)

你需要使用一个宏。这是基本方法:

%let vv1 = 9;
%let vv2 = 2;
%let vv3 = 10;

data have;
drop i;
do i = 1 to 5;
date = i;
output;
end;
run;

%macro test;
data test;
set have;

%do i=1 %to 3;
 if date= &&vv&i then savinglight = 1;
%end;
run;
%mend test; 

%test;