[英]How to resolve macro variable in a loop in SAS
我试图弄清楚如何在SAS的数据步骤内的循环中调用宏变量,但是我迷路了; 所以我有14个宏变量,我必须将它们与向量的条目进行比较。 我试过了:
data work.calendrier;
set projet.calendrier;
do i=1 to 3;
if date= "&vv&i"D then savinglight = 1;
end;
run;
但这是行不通的。 变量vv1到vv3是日期变量。 例如,此代码有效:
data work.calendrier;
set projet.calendrier;
*do i=1 to 3;
if date= "&vv1"D then savinglight = 1;
*end;
run;
但是使用循环无法解析宏变量。
如果要引用带有数字索引的宏变量,例如vv1,vv2,vv3,则需要先解析&i。
SAS有一个单独的宏处理器,可以在值到达数据步处理器之前对其进行解析。
本质上,您需要在宏变量的开头添加额外的“&”号:
&&vv&i -> &vv1 -> "Value of vv1"
&&vv&i -> &vv2 -> "Value of vv2"
&&vv&i -> &vv3 -> "Value of vv3"
此处发生的是SAS在&号后面读取信息,直到找到中断为止。 SAS然后将&&解析为单个&,然后继续读取直到将&i解析为数值。 然后,您将剩下所需的&vvi变量。
有关此有趣主题的几个资源:
http://www2.sas.com/proceedings/sugi29/063-29.pdf http://www.lexjansen.com/nesug/nesug04/pm/pm07.pdf
在SAS编译并运行数据步骤之前,将解析宏变量引用。 您需要首先弄清楚如何使用SAS语句执行所需的操作,然后,如有必要,可以使用宏代码来帮助您生成这些语句。
如果要测试变量的值是否与值列表之一匹配,请考虑使用IN
运算符。
data work.calendrier;
set projet.calendrier;
savinglight = date in ("&vv1"d,"&vv2"d,"&vv3"d);
run;
您需要使用宏。 这是基本方法:
%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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.