Как условие IF-THEN / ELSE работает над этой проблемой? - PullRequest
0 голосов
/ 10 ноября 2018

Я немного озадачен, почему вывод определенным образом выполняется в следующей программе.

 data a;
 input name$ lv @@;
 cards;
 Frank 1 Joan 2 Sui 3 Burt 4 Kelly . Juan 1
 ;
 data b;
 set a;
 if lv=.
 then expertise='?';
 else if lv=1 
       then expertise='L';
       else if lv=2 or 3 
            then expertise ='M';
            else expertise ='H';
 run;
 proc print data=b;
 run;

В вышеприведенной программе я ожидаю, что вывод для наблюдения, содержащего Берта, имеет экспертную оценку значения H, но по какой-то причине это M.

Я думал, что утверждение if должно быть lv = (2 или 3), но когда я делаю это сейчас, то те, которые думают, что lv = 2 и lv = 3, чья экспертиза должна равняться M, теперь тоже становятся H.

* Это, вероятно, объясняется тем, что синтаксис не подходит, и lv никогда не бывает (2 или 3) / Я не уверен, почему это не вызывает ошибку /, таким образом, оператор ELSE казнены.

У меня такое чувство, что я не понимаю, как на самом деле работает ELSE.

Однако в соответствии с этой логикой, если часть lv = 2 распознается, а остальные нет, я не уверен, почему lv = 3 и lv = 4 не дают H.

Моя цель - понять, почему программа работает так, как будто нет синтаксической ошибки, и почему вывод такой, какой он есть.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Ваш синтаксис неправильный, но не незаконный, поэтому SAS сделал то, что вы просили, а не то, что вы хотели. Условие lv=2 or 3 оценивается слева направо. Таким образом, lv=2 приведет к 1 или 0 в зависимости от того, равно ли значение lv 1006 * или нет. Но оба значения 1 or 3 и 0 or 3 будут истинными, поскольку 3 всегда считается истинным.

Что вам действительно нужно, так это оператор in.

if missing(lv) then expertise='?';
else if lv=1 then expertise='L';
else if lv in (2 3) then expertise ='M';
else expertise ='H';
0 голосов
/ 10 ноября 2018

Ваша ошибка здесь

If lv = 4 or 0 

Вы думаете, что это означает

If lv = 4 or lv = 0

Но это не так. Что на самом деле происходит, это

If (lv = 4) or 0

В SAS 0 равно false, а любое число больше 1 - true. Не уверен насчет десятичных дробей. В любом случае. Условие или делает это ложным. Но в вашем первом примере это всегда так.

...