在SAS宏循环中不为空

时间:2016-01-14 20:56:47

标签: sas sas-macro

您好我仍然在努力使用SAS MACRO循环:

%Let t1=12Mth;
%Let t2=20;
%Let t3=40;
%Let t4=40;
%Let t5=50;
%Let t6=60;

%macro Clean(time);
data Milk1;
set MilkNew;
%Do I = 1 %to &time.; 

 /*If MilkE=2, then MilkF should be 0 and MilkA should be 0 and should be 99 and  MilkT..Sp should be null*/

if (MilkE=2 and (MilkF&&t&I. ne 0 or MilkA&&t&I. ne 0 or (MilkT&&t&I..Sp is not NULL) ) ) then delete;
%end;
run;
%mend Clean;
%Clean(6)

此代码的目的是删除错误的条目。错误发生在“is”来自“is not null”。它显示了期望算术运算符。为什么“不是空”不能在这里使用?有没有其他方法可以做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:2)

这与宏语言无关。 is not null在该上下文中不是有效的SAS语法(在主数据步骤中)。它仅在以下情况下有效:

  • PROC SQL语法
  • WHERE陈述
  • WHERE数据集选项

以及其他一些不经常遇到的设置。在基本的SAS语法中,它是不合法的。

您可以使用对missing函数的引用或缺少值(' '表示字符,.表示数字)替换它。

if (MilkE=2 and (MilkF&&t&I. ne 0 or MilkA&&t&I. ne 0 or not missing(MilkT&&t&I..Sp)  ) ) then delete;

这就是我写这个的方式。