为什么在以下程序中以某种方式输出,我感到有点困惑。
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;
在上面的程序中,我期望包含Burt的观测结果的输出具有H的专业知识,但由于某种原因,其值为M。
我本以为if语句应该为lv =(2或3),但是现在当我这样做时,那些以为专门知识应该等于M的lv = 2和lv = 3的人现在也变成了H。
*这可能是因为语法不合适,并且lv永远不会(2或3)/ 我不确定为什么这不会引起错误 /,所以用ELSE语句来解释被执行。
我有一种不了解ELSE实际工作方式的感觉。
但是,根据该逻辑,如果lv = 2部分被识别而其他部分未被识别,我不确定为什么lv = 3和lv = 4不会产生H。
我的目标是了解为什么程序会像没有语法错误一样运行,为什么输出的是原样。
答案 0 :(得分:2)
您的错误在这里
If lv = 4 or 0
您认为这意味着
If lv = 4 or lv = 0
但不是。实际发生的是
If (lv = 4) or 0
在SAS中,0为false,任何大于1的数字为true。不确定小数点。无论如何。或条件使此错误。但是在您的第一个示例中,它始终是正确的。
答案 1 :(得分:2)
您的语法不正确,但不是非法的,因此SAS满足了您的要求而不是您想要的。条件lv=2 or 3
从左到右评估。因此,根据lv=2
的值是否为1
,0
会产生lv
或2
。但是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';