我有一个非常庞大的数据集,每个患者都有多种诊断(25),由SPSS中的ICD 10代码表示。为简便起见,我发布了一个快照示例,该快照仅使用3个标记为DIAG1到DIAG3的字符串变量和随机代码的测试数据集进行复制。
假设每一行代表一个病人。 “ 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中非常基本的语法问题的输入/指导。
答案 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
尝试找到解决方法(或开始一个新问题!)。