循环遍历多个字符串变量以生成存在/不存在的结果变量

时间:2018-10-10 20:13:41

标签: string loops syntax spss

我有一个非常庞大的数据集,每个患者都有多种诊断(25),由SPSS中的ICD 10代码表示。为简便起见,我发布了一个快照示例,该快照仅使用3个标记为DIAG1到DIAG3的字符串变量和随机代码的测试数据集进行复制。

enter image description here

假设每一行代表一个病人。 “ O74”列中显示的结果是我正在尝试复制的结果,但到目前为止没有任何结果(只需手动输入要使用语法复制的内容即可)。本质上,存在或不存在的二分变量均以“ 1”表示具有“ O74”的患者,可在任何“ DIAG”列中进行诊断。我尝试过:

do repeat x = DIAG1 to DIAG3.
compute O74 = any(x,"O74001", "O74019").
end repeat.
EXECUTE.

但是,在运行语法时,仅出现上面两个列出的代码在DIAG3中的出现。鉴于我的语法技巧非常差,我无法理解为什么在使用上述“执行重复”代码时,DIAG1和DIAG2中O74001和O74019的发生率未合并到变量“ O74”中。

理想情况下,我只想在“重复”或“循环”中包含“ O74”,而不是键入每个单独的ICD代码。语法:

compute flag = char.index(UPPER(DIAG2), 'O74') > 0.​

的工作非常出色,但是,按照编码,它一次只能工作一个“ DIAG”列。考虑到数量惊人的患者(> 3,000,000)和每个患者的诊断数量(25),将其合并到一个循环中将是理想的。已经进行了多次尝试。

出于“测试”数据集的目的,已连续列出变量“ DIAG”。在实际数据集中,每个“ DIAG”由两个变量分隔。如果使这些变量连续列出的解决方案要简单得多,那肯定可以做到。

我非常感谢任何对SPSS中非常基本的语法问题的输入/指导。

1 个答案:

答案 0 :(得分:1)

所以您的循环不起作用的原因是,每次循环运行“ DIAG(X)”的比较都会替换先前的比较,因此只有最后一个“存活”。 解决问题的方法有很多,这是最简单的:

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尝试找到解决方法(或开始一个新问题!)。