Не является нулевым в цикле макросов SAS

Привет, я все еще борюсь с циклом 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)

Цель этого кода — удалить неправильные записи. Ошибка возникает на "есть" из "не равно нулю". Он показывает Ожидание арифметического оператора. Почему здесь нельзя использовать «не Null»? Есть ли альтернативный способ сделать это?

Спасибо!


person Yukun    schedule 14.01.2016    source источник


Ответы (1)


Это не имеет ничего общего с языком макросов. 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;

Я бы так и написал.

person Joe    schedule 14.01.2016
comment
Да, ваш ответ очень ясен и not missing работает! Спасибо! - person Yukun; 15.01.2016