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
我不明白 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