问题描述
我有一个包含 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
(或您自己建议的 max
或 sum
):
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.