我正在尝试选择具有特定诊断代码的案例。诊断代码存储在DX1,DX2,DX3,DX4 ......等多列中。为每个病人。每位患者都可以进行多次诊断。 如果ICD代码75673在任何诊断栏中匹配,这意味着该病例(患者)具有特定的诊断 - 在这种情况下,胃痉挛和GastroID应记录为1,其他明智的GastroID应为0。
有时ICD代码在范围内,并且需要根据范围内的一个ICD代码检查每个诊断列。 例如,腹壁缺陷由7567至75679之间的代码组成。
我尝试循环播放。它创建列名称GastroID,但输出不是" 1"或" 0"。我可能做错了什么?
DEFINE FINDCASES (ICD=!CHAREND("/") /
DX=!CMDEND).
!DO !I !IN (!ICD)
!DO !J !IN (!DX)
!IF (!J = !I) !THEN COMPUTE GastroID=1
!ELSE COMPUTE GastroID=0
!IFEND
!DOEND
!DOEND
!ENDDEFINE.
FINDCASES ICD = '75673' /DX=DX1 DX2 DX3 DX4.
答案 0 :(得分:2)
您不需要宏。 如果必须针对一组变量检查1个代码:
numeric GastroID (f1.0).
compute GastroID=0.
if any(75673 ,DX1, DX2, DX3, DX4) GastroID=1.
execute.
从您的帖子中不清楚如果DX1 - DX4是字符串或数字变量。如果它们是字符串,则需要将参数作为字符串传递,因此请使用:
if any('75673' ,DX1, DX2, DX3, DX4) GastroID=1.
而不是上述。
如果您必须针对一组变量检查多个代码,则可以使用count
count GastroID=DX1 DX2 DX3 DX4 (code1, code2, code3, code4).
exe.
if GastroID>1 GastriID=1.
exe.
如果你有一系列代码,你也可以把它写成:
count GastroID=DX1 DX2 DX3 DX4 (code1 thru code4).
但: - 确保您需要code1和code4之间的所有数字 - 这对字符串有风险,因为字符串范围以不同的方式工作;它们按第一个字符排序;所以" 2">" 10&#34 ;;因此" 1"至" 10"包括以" 2"
开头的所有字符串您的所有DX号码都存储为字符串吗?如果您确定是这种情况,您可能希望将它们全部转换为数值变量:
alter type variable_name (f8.0).
数字比字符串更容易处理。
答案 1 :(得分:2)
这是一个循环,它使用@ horace_vr的答案中的基本思想,但解决了多个条件:
compute GastroID=0.
do repeat CodNum=7567 75679 75673.
if GastroID=0 GastroID=any(CodNum, DX1 to DX4).
end repeat.
注意 - 如果变量DX1到DX4在文件中不连续,则不能在语法中使用to
,但必须分别为它们命名。另外,正如@horace_vr所说,如果这些变量是文本而不是数字,请将数字放在引号中。
现在,如果您有许多像这样的代码组,您可以为每个代码组创建一个do repeat
循环。或者你可以使用一个循环(这可能有点令人困惑):
numeric GastroID grp2ID grp3ID (f1).
do repeat CodNum=7567 75679 75673 111 112 113 456 4567 4566
/NewVar=GastroID GastroID GastroID grp2ID grp2ID grp2ID grp3ID grp3ID grp3ID.
if missing(NewVar) or NewVar=0 NewVar=any(CodNum, DX1 to DX4).
end repeat.