繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM