遍历多个字符串变量以生成 presence/absence 的结果变量
Looping through multiple string variables to generate outcome variable of presence/absence
我有一个非常大的数据集,其中包含每位患者的多项诊断 (25),由 SPSS 中的 ICD 10 代码表示。为简洁起见,我发布了一张快照,展示了我试图简单地使用标记为 DIAG1 到 DIAG3 的 3 个字符串变量和随机代码的测试数据集来复制的内容。
假设每一行代表一个病人。 "O74" 列中显示的结果是我试图复制的结果,但到目前为止无济于事(只是手动输入了我希望使用语法复制的内容)。本质上是一个 presence/absence 二分变量,其中“1”表示在 "DIAG" 列中的任何一个列中有 "O74" 诊断的患者。我尝试过:
do repeat x = DIAG1 to DIAG3.
compute O74 = any(x,"O74001", "O74019").
end repeat.
EXECUTE.
然而,根据运行语法,只有上面列出的两个代码在DIAG3中出现。鉴于我极其糟糕的语法技能,我无法理解为什么在使用上述 "do repeat" 代码时,DIAG1 和 DIAG2 中 O74001 和 O74019 的发生率没有包含在变量 "O74" 中。
理想情况下,我只想在 "do repeat" 或 "loop" 中包含 "O74",而不是键入每个单独的 ICD 代码。语法:
compute flag = char.index(UPPER(DIAG2), 'O74') > 0.
确实工作得很好,但是,正如编码的那样,它一次只能工作一个 "DIAG" 列。考虑到患者数量惊人 (>3,000,000) 和每位患者的诊断数量 (25),将其合并到循环中将是理想的选择。已进行多次尝试。
出于 "test" 数据集的目的,变量 "DIAG" 已连续列出。在实际数据集中,每个 "DIAG" 由两个变量分隔。如果连续列出这些变量的解决方案更简单,那当然可以做到。
我非常感谢任何 input/guidance 对 SPSS 中可能是非常初级的语法问题的解答。
所以你的循环不起作用的原因是每次它运行 "DIAG(X)" 的比较都会替换之前的比较,所以只有最后一个 "survives"。
纠正问题的方法有很多种,这里介绍最简单的:
compute O74=0.
do repeat x = DIAG1 to DIAG3.
if O74=0 O74 = any(x,"O74001", "O74019").
end repeat.
这样,如果 O74 在某个时候变为 1,则在下一次循环运行时它不会再次返回到 0。
其他语法也是如此:
compute flag = 0.
do repeat x = DIAG1 to DIAG25.
if flag=0 flag = (char.index(UPPER(x), 'O74') > 0 ).
end repeat.
至于 DIAG 变量的顺序 - 如果它们不是连续的,您只需分别命名它们 (do repeat x = DIAG1 DIAG2 DIAG3 DIAG4 ....DIAG25
)。或者,您可以使用以下命令在宏中创建列表(您可以在我的回答 here 中查看示例):
spssinc select variables macroname="!alldiags" /properties pattern="DIAG*".
在 运行 之后,您可以使用这样创建的宏:
do repeat x = !alldiags.
请注意,列表中将捕获以 "DIAG" 开头的任何其他变量。如果你有任何问题,请查找 spssinc select variables
以尝试找到解决它们的方法(或开始一个新问题!)。
我有一个非常大的数据集,其中包含每位患者的多项诊断 (25),由 SPSS 中的 ICD 10 代码表示。为简洁起见,我发布了一张快照,展示了我试图简单地使用标记为 DIAG1 到 DIAG3 的 3 个字符串变量和随机代码的测试数据集来复制的内容。
假设每一行代表一个病人。 "O74" 列中显示的结果是我试图复制的结果,但到目前为止无济于事(只是手动输入了我希望使用语法复制的内容)。本质上是一个 presence/absence 二分变量,其中“1”表示在 "DIAG" 列中的任何一个列中有 "O74" 诊断的患者。我尝试过:
do repeat x = DIAG1 to DIAG3.
compute O74 = any(x,"O74001", "O74019").
end repeat.
EXECUTE.
然而,根据运行语法,只有上面列出的两个代码在DIAG3中出现。鉴于我极其糟糕的语法技能,我无法理解为什么在使用上述 "do repeat" 代码时,DIAG1 和 DIAG2 中 O74001 和 O74019 的发生率没有包含在变量 "O74" 中。
理想情况下,我只想在 "do repeat" 或 "loop" 中包含 "O74",而不是键入每个单独的 ICD 代码。语法:
compute flag = char.index(UPPER(DIAG2), 'O74') > 0.
确实工作得很好,但是,正如编码的那样,它一次只能工作一个 "DIAG" 列。考虑到患者数量惊人 (>3,000,000) 和每位患者的诊断数量 (25),将其合并到循环中将是理想的选择。已进行多次尝试。
出于 "test" 数据集的目的,变量 "DIAG" 已连续列出。在实际数据集中,每个 "DIAG" 由两个变量分隔。如果连续列出这些变量的解决方案更简单,那当然可以做到。
我非常感谢任何 input/guidance 对 SPSS 中可能是非常初级的语法问题的解答。
所以你的循环不起作用的原因是每次它运行 "DIAG(X)" 的比较都会替换之前的比较,所以只有最后一个 "survives"。 纠正问题的方法有很多种,这里介绍最简单的:
compute O74=0.
do repeat x = DIAG1 to DIAG3.
if O74=0 O74 = any(x,"O74001", "O74019").
end repeat.
这样,如果 O74 在某个时候变为 1,则在下一次循环运行时它不会再次返回到 0。 其他语法也是如此:
compute flag = 0.
do repeat x = DIAG1 to DIAG25.
if flag=0 flag = (char.index(UPPER(x), 'O74') > 0 ).
end repeat.
至于 DIAG 变量的顺序 - 如果它们不是连续的,您只需分别命名它们 (do repeat x = DIAG1 DIAG2 DIAG3 DIAG4 ....DIAG25
)。或者,您可以使用以下命令在宏中创建列表(您可以在我的回答 here 中查看示例):
spssinc select variables macroname="!alldiags" /properties pattern="DIAG*".
在 运行 之后,您可以使用这样创建的宏:
do repeat x = !alldiags.
请注意,列表中将捕获以 "DIAG" 开头的任何其他变量。如果你有任何问题,请查找 spssinc select variables
以尝试找到解决它们的方法(或开始一个新问题!)。