SPSS 语法 - Do Repeat 中的变量嵌套循环

问题描述

我有一个包含 15 个供应商类型和 17 个产品类别的数据集。我想标记给定的供应商是否被指定为 17 个产品类别中的任何一个的“主要”供应商。我想用嵌套循环来做到这一点。下面是循环遍历第一种供应商类型的产品类别的基本示例:

在这里,我们正在检查第一个供应商(由 .1 表示,后缀 - 第二个供应商将有一个“.2”后缀)是任何产品类别的主要供应商,由其他索引指示(例如,QA6R11、QA6R12 等) . Do Repeat 使这对于单一供应商类型很容易做到:

* First supplier Type.

    Compute QA6R_Sup_1 = 0.
    Variable Labels QA6R_Sup_1 "supplier Type 1". 

        Do Repeat supplier = QA6R11.1 QA6R12.1 QA6R13.1 QA6R14.1 QA6R15.1 QA6R16.1 QA6R17.1
        QA6R18.1 QA6R19.1 QA6R971.1 QA6R21.1 QA6R22.1 QA6R23.1 QA6R24.1 QA6R25.1 QA6R26.1 QA6R27.1 QA6R972.1.

            If supplier = 1 QA6R_Sup_1 = 1.

        end repeat.

在这里,我尝试将 Do Repeat 循环嵌套在 Product Category 循环中,以避免对所有 17 个产品类别进行插入和卡顿,但由于没有在 Do Repeat 中处理串联而导致错误

define !suppliers_PrimaryUsed (Categories=!cmdend)
    !do !i !in (!Categories)
        compute !concat("QA6R_Sup_",!i) = 0. 

            Do Repeat supplier = !concat("QA6R11.",!i) !concat("QA6R12.",!i) !concat("QA6R13.",!i) !concat("QA6R14.",!i) !concat("QA6R15.",!i) !concat("QA6R16.",!i) !concat("QA6R17.",!i
            !concat("QA6R18.",!i) !concat("QA6R19.",!i) !concat("QA6R971.",!i) !concat("QA6R21.",!i) !concat("QA6R22.",!i) !concat("QA6R23.",!i) !concat("QA6R24.",!i)
            !concat("QA6R25.",!i) !concat("QA6R26.",!i) !concat("QA6R27.",!i) !concat("QA6R972.",!i).
                
                 If supplier = 1 !concat("QA6R_Sup_",!i) = 1.

            end repeat.

          VARIABLE LEVEL !concat("QA6R_Sup_",!i) (NOMINAL).
          ADD VARIABLE LABELS !concat("QA6R_Sup_",!i) 0 "No" 1 "Yes".
    !doend
    exe.
!enddefine.
!suppliers_PrimaryUsed Categories= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 97.

我想知道SPSS语法是否可以处理这种使用索引通过代码拉出变量列表的嵌套循环,或者我是否需要使用Python语言来完成。

或者,如果有一种我没有看到的更简单的方法来做到这一点(例如,现在意识到它们都是二进制的,所以我可以将它们相加),那就太棒了,这不会是第一次.让我知道你的想法!

解决方法

无需实际循环即可实现您的第一个循环,只需使用 any(或您自己建议的 maxsum):

Compute QA6R_Sup_1 = any(1,QA6R11.1,QA6R12.1,QA6R13.1,QA6R14.1,QA6R15.1,QA6R16.1,QA6R17.1,QA6R18.1,QA6R19.1,QA6R971.1,QA6R21.1,QA6R22.1,QA6R23.1,QA6R24.1,QA6R25.1,QA6R26.1,QA6R27.1,QA6R972.1).

所以整个循环可以是这样的(当我们使用宏时,不妨一路走一遍双循环):

define !Suppliers_PrimaryUsed (Cats1=!charend("/")/Cats2=!cmdend)
  !do !i !in (!Cats1)
  compute !concat("QA6R_Sup_",!i) = any(1 !do !j !in (!Cats2),!concat("QA6R",!j,".",!i) !doend ). 
  VARIABLE LEVEL !concat("QA6R_Sup_",!i) (NOMINAL).
  ADD VARIABLE LABELS !concat("QA6R_Sup_",!i) 0 "No" 1 "Yes".
  !doend
!enddefine.
!Suppliers_PrimaryUsed Cats1 = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 97
            /Cats2 = 11 12 13 14 15 16 17 18 19 71 21 22 23 24 25 26 27 72.