Насколько мне известно, не существует формального / прямого способа запуска al oop в параллельных списках в макросе SPSS, поэтому вы можете выбрать - либо go Python, либо найти обходной путь - вот несколько идей:
1. Воссоздайте оба списка, используя число l oop
, так что вы l oop на числах скажете от 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. L oop по одному списку при «проглатывании» второго
Макрос SPSS l oop выполняет итерации только по одному списку за раз - но вместо итерации по второму списку вы можете взять элемент и удаляйте его из второго списка для каждой итерации первого списка:
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
- но это для отдельного вопроса).