据我所知,没有正式/直接的方法可以在 SPSS 宏中的并行列表上运行循环,因此您的选择是 - 要么使用 Python,要么找到解决方法 - 这里有一些想法:
1. 使用数字循环重新创建两个列表
所以你循环数字 1 到 5,并使用它们来创建变量名称 -
v1 到 v5 以及“工作表 1”到“工作表 5”:
!do !i=1 !to 5
.....
by !concat("v",!i) [mean f1.2, totals[mean f1.2]].
.....
sheet = !quote(!concat("sheet ",!i))
.....
!doend
如果它们不是常量,您还可以将开始和/或结束数字添加到宏调用中。
当然,只有当您的两个列表共享相同的编号(如上例所示)时,这才有效。如果没有,您可以使用以下方法之一:
2. 循环遍历一个列表,同时“吃掉”第二个列表
SPSS 宏循环一次仅迭代一个列表 - 但您可以在第一个列表的每次迭代中获取一个项目并将其从第二个列表中删除,而不是迭代第二个列表:
define col (!pos !charend('/') / !pos !cmdend)
!let !arr2=!2
!do !i !in(!1)
.....
by !i [mean f1.2, totals[mean f1.2]].
.....
!let !sheet=!head(!arr2)
!let !arr2=!tail(!arr2)
.....
sheet = !sheet
.....
!doend
!enddefine.
*and the macro call:
col VARa VARb VARc/"sheet 1" "sheet 2" "sheet 3".
3. 在单对上定义宏,使用多个宏调用这是最简单的方法,如果每个列表中只有几个项目 - 您可以使用单个变量名称和单个工作表名称定义宏,您将能够通过运行获得相同的结果 -
col VARa/ "sheet 1" .
col VARb/ "sheet 2" .
代替col VARa VARb/ "sheet 1" "sheet 2" .
正如你之前尝试过的那样。
如果这些列表很长,您可以单独自动运行宏调用(使用write
例如命令 - 但这是一个单独的问题)。