下面的我的SPSS语法代码不会产生预期的结果。即使reason
等于15或16,它也会将ped.crossing.with.signal
标记为1。
COMPUTE ped.crossing.with.signal = 0.
IF ((ped.action = 1 | ped.action = 2) AND (reason ~= 15 | reason ~= 16)) ped.crossing.with.signal = 1.
EXECUTE.
当我这样做时,它有效......但为什么?
COMPUTE ped.crossing.with.signal = 0.
IF (ped.action = 1 | ped.action = 2) ped.crossing.with.signal = 1.
IF (reason = 15 | reason = 16) ped.crossing.with.signal = 0.
EXECUTE.
答案 0 :(得分:2)
这不是一个不稳定的结果,而是由De Morgan's Laws解释的布尔代数的正确应用。
表达式(reason ~= 15 | reason ~= 16)
等同于~(reason = 15 and reason = 16)
,在这种情况下永远不能评估为false(因为单个变量不能包含两个值)。从逻辑上讲,要使用的正确表达式为(reason ~= 15 & reason ~= 16)
或~(reason = 15 | reason = 16)
,尽管已经使用any
函数指出更为直接。
答案 1 :(得分:1)
你的语法看起来不错,但实际上逻辑上不像你想要的那样Jay在他的回答中指出。
此外,您可以简化语法,以避免复杂的布尔否定:
COMPUTE ped.crossing.with.signal = ANY(ped.action, 1, 2) AND ANY(reason, 15, 16)=0.
以这种方式使用单个COMPUTE
命令将使您的处理更有效/更快,更不用说更简约的代码了。