【问题标题】:How to resolve macro variable in a loop in SAS如何在SAS的循环中解析宏变量
【发布时间】:2016-12-18 19:57:38
【问题描述】:

我试图弄清楚如何在 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; 

但循环无法解析宏变量。

【问题讨论】:

  • 您使用宏变量而不是数组是否有原因?
  • 从您的代码看来只有一个变量而不是“向量”。如果 DATE 的值与任何宏变量值匹配,是否要将新变量设置为 1?

标签: loops macros sas datastep


【解决方案1】:

如果要引用具有数字索引的宏变量,例如 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您需要使用宏。这是基本方法:

      %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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        相关资源
        最近更新 更多