sas如何计算case语句的值

how does sas calculates the value of a case statement

我不明白 sas 如何计算 PATIENT 的值,我到处都看过,但似乎没有文档说明 sas 如何计算 case 括号中的公式,我只知道当值 PATIENT 甚至 CASE 表达式的布尔结果为 1 、 0 或 2 ,但我只是不知道如何从表达式中获取值,有人可以解释一下吗?

PROC SQL;
 CREATE TABLE TESTMED AS
 SELECT PATIENT,
 CASE ((PATIENT/2 = INT(PATIENT/2)) +
 (PATIENT = .))
 WHEN 1 THEN 'Med A' WHEN 0 THEN
 'Med B' ELSE 'Error' END AS DOSEGRP
 LENGTH=5
 FROM VITALS
 ORDER BY PATIENT;
QUIT; 

我看不出任何错误。

如果患者可以。 0 1 2 这将是(第一个表达式 + 第二个表达式):

0 ---> {0=0}true(1) + {patient=.} false(0) = 1
1 ---> {0.5=0}false(0) + {patient=.} false(0) = 0
2 ---> {1=1}true(1) +{patient=.} false(0) = 1
. ---> {.=.} true(1) + {patient=.} true(1) = 2

如果您想查看该布尔表达式的结果,您可以简单地使用:

PROC SQL;
 CREATE TABLE TESTMED AS
 SELECT patient, 
     ((PATIENT/2 = INT(PATIENT/2)) + (PATIENT = .))  AS result
 LENGTH=5
 FROM VITALS
 ORDER BY PATIENT;
QUIT; 

你会发现结果是正确的。 所以你的布尔表达式只能假设 3 个值:

(1=0+1)
(0=0+0)
(2=1+1)

When 0 you assign MEDA;
When 1 you assign MEDB;
When 2 you assign ERROR;

并且为缺失值分配了 ERROR。

1st expression:
{missing/2=missing} = {int(missing)=missing} [errors are reported as missing]
missing=missing ---> true ---> 1

2nd expression:
missing=missing ---> true ---> 1

result:
1+1=2 ---> ERROR

SAS 将布尔表达式计算为 1(真)或 0(假)。所以你的表达是其中两个的总和。所以可能的答案是 0、1 或 2。

当 PATIENT 为偶数或缺失时,第一个表达式 (PATIENT/2 = INT(PATIENT/2)) 将为真。当缺少 PATIENT 时,第二个表达式 (PATIENT = .) 将为真。因此,结果 2 表示患者缺失,结果 1 表示患者是偶数,结果 0 表示患者是奇数。

因此您可以将 case 语句重写为:

CASE WHEN MISSING(PATIENT) then 'Error'
     WHEN MOD(PATIENT,2)=1 then 'Med A'
     ELSE 'Med B'
END AS DOSEGRP