Какая разница в использовании char между оператором where и if в SAS 9.4M6? - PullRequest
1 голос
/ 28 апреля 2020

Недавно я обнаружил интересную вещь:

data test;
    set sashelp.class;
    if _N_ in (2 3 5 7) then name = '';
run;

data test;
    set ;
    where name;
run;

Результат: Тест данных имеет 15 наблюдений.

Я использую SAS 9.4M6 для в течение года и не помню, что where statment может иметь дело с переменной типа char точно так же, как переменная типа boolean. Я строго изменяю where на if, и это приводит к результатам: имя не является числовой c переменной и данные Test имеют 0 наблюдений.

Итак, вот мои два вопроса :
1. Является ли where name; другим способом where name is not missing? если нет, что произойдет при отправке where name?
2. Когда этот код (where <variable>;) был разрешен в SAS?

Спасибо за любые советы.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Интересная находка! Я тоже этого не заметил. Я попробовал это на 9.4M4 и 9.4M5 и получил те же результаты. Это может быть что-то добавлено даже раньше, чем это. Я также не вижу документации по этому вопросу. Из тестирования я вижу следующее:

  1. where операторы могут автоматически преобразовывать такие символы, как if name, в логические операторы

  2. if операторы не преобразуют символы в логические значения автоматически и требуют от пользователя явного указания символа, который вы пытаетесь исключить, например,

Код:

data want;
    set test ;
    if(NOT missing(name));
run;

Я не могу сказать, когда это было добавлено, но это раньше, чем версии, к которым у меня есть доступ. Ваш тестовый код будет отличным вопросом для теста!

1 голос
/ 28 апреля 2020

Да, это тест для непустых значений. Я использовал его в течение многих лет, в основном при интерактивном просмотре набора данных. Я подозреваю, что это происходило с тех пор, как SAS ввел оператор WHERE, или, по крайней мере, с тех пор, как они пересмотрели его для использования того же синтаксиса, что и предложения SQL WHERE.

В операторах WHERE используется PRO C SQL синтаксис стиля (использование LIKE без использования списков переменных), но операторы IF используют обычный синтаксис SAS.

Так что, если вы использовали

if name ;

на шаге данных, вы увидите заметки о том, что SAS пытается преобразовать символьную переменную NAME в число, которое может быть оценено как FALSE (ноль отсутствует) ) или ИСТИНА (любое другое значение). Поскольку имена в SASHELP.CLASS не могут быть преобразованы в числа, все они будут рассматриваться как ЛОЖЬ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...