在SAS宏循环中不为null

在SAS宏循环中不为null,sas,sas-macro,Sas,Sas Macro,嗨,我仍在为SAS宏循环而挣扎: %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 Mi

嗨,我仍在为SAS宏循环而挣扎:

%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”之间的“is”。它显示需要一个算术运算符。为什么这里不能使用“is not Null”?有没有其他方法可以做到这一点


谢谢

这与宏语言无关<代码>不为空在该上下文中(在主数据步骤中)是无效的SAS语法。它仅在以下情况下有效:

  • PROC-SQL
    语法
  • 其中
    语句
  • 其中
    数据集选项
以及其他一些不常遇到的设置。在基本SAS语法中,它是不合法的

您可以将其替换为对
缺少的
函数的引用,或缺少的值(
'
表示字符,
表示数字)


我就是这样写的。

这与宏语言无关<代码>不为空在该上下文中(在主数据步骤中)是无效的SAS语法。它仅在以下情况下有效:

  • PROC-SQL
    语法
  • 其中
    语句
  • 其中
    数据集选项
以及其他一些不常遇到的设置。在基本SAS语法中,它是不合法的

您可以将其替换为对
缺少的
函数的引用,或缺少的值(
'
表示字符,
表示数字)


这就是我要写的。

是的,你的答案非常清楚,
没有遗漏
有效!谢谢是的,您的答案非常清楚,
不遗漏
有效!谢谢
if (MilkE=2 and (MilkF&&t&I. ne 0 or MilkA&&t&I. ne 0 or not missing(MilkT&&t&I..Sp)  ) ) then delete;