Statistics 在SPSS宏中通过并行列表/数组循环
我想编写一个SPSS宏来执行三个操作:Statistics 在SPSS宏中通过并行列表/数组循环,statistics,spss,Statistics,Spss,我想编写一个SPSS宏来执行三个操作: 生成自定义表 清洁输出窗口 导出表 正如您所知,SPSS宏工具允许使用两种类型的循环:'numeric'like(!do!i=!x!to!y)和'list'/'作为每个'like(!do!i!in(!1))的循环。我的目标是创建一个调用宏,如下所示: colv1 v2/“工作表A”“工作表B”。 以这种方式工作(使用类似“列表”的循环): 获取第一个变量名(v1) 将其放入ctables宏部分 获取第一个工作表名称(字符串“工作表A”) 将其放入输出导出宏
!do!i=!x!to!y
)和'list'/'作为每个'like(!do!i!in(!1)
)的循环。我的目标是创建一个调用宏,如下所示:
colv1 v2/“工作表A”“工作表B”。
以这种方式工作(使用类似“列表”的循环):
ctables
宏部分输出导出
宏部分define col (!positional !charend('/')
/!positional !cmdend)
!do !i !in (!1)
output close all.
ctables
/table x1 + x2
by !i [mean f1.2, totals[mean f1.2]].
output modify
/select logs headings texts warnings pagetitles outlineheaders notes
/deleteobject delete = yes.
!doend
!do !i !in (!2)
output export
/contents export = visible
/xlsx documentfile = "E:\path\file.xlsx"
operation = createsheet
sheet = !i.
!doend
!enddefine.
*** MACRO CALL.
col v1 v2 / "Sheet A" "Sheet B".
输出总体上是不正确的,因为我只得到了带有第二个变量的表。然而,在文件中我发现了两张有正确名称的纸。所以,我试着筑巢:
define col (!positional !charend('/')
/!positional !cmdend)
!do !i !in (!1)
!do !j !in (!2)
output close all.
ctables
/table x1 + x2
by !i [mean f1.2, totals[mean f1.2]].
output modify
/select logs headings texts warnings pagetitles outlineheaders notes
/deleteobject delete = yes.
output export
/contents export = visible
/xlsx documentfile = "E:\path\file.xlsx"
operation = createsheet
sheet = !j.
!doend
!doend
!enddefine.
*** MACRO CALL.
col v1 v2 / "Sheet A" "Sheet B".
输出完全相同,这意味着SPSS将“/”左侧列表中的每个元素与“/”右侧列表中的每个元素交叉,并覆盖Excel文件中以前的结果。我的目标是接收如下宏扩展:
* FIRST EXPANSION:
...
ctables
/table x1 + x2
by v1 [mean f1.2, totals[mean f1.2]].
...
output export
/contents export = visible
/xlsx documentfile = "E:\path\file.xlsx"
operation = createsheet
sheet = "Sheet A".
* SECOND (LAST) EXPANSION:
...
ctables
/table x1 + x2
by v2 [mean f1.2, totals[mean f1.2]].
...
output export
/contents export = visible
/xlsx documentfile = "E:\path\file.xlsx"
operation = createsheet
sheet = "Sheet B".
换句话说,-2列出x2个元素,但只有两个循环,而不是四个循环。有人知道如何得到这样的结果吗?据我所知,在SPSS宏中没有正式/直接的方法在并行列表上运行循环,因此您可以选择使用Python或找到解决方法,以下是一些想法: 1。使用数字循环重新创建两个列表
所以你循环数字,比如1到5,然后用它们来创建变量名- v1至v5和“表1”至“表5”: 如果起始号码和\或结束号码不是常量,也可以将它们添加到宏调用中。
当然,只有当您的两个列表共享一个相同的编号(如上面的示例所示)时,这才有效。如果没有,您可以使用以下选项之一: 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
命令-但这是一个单独的问题)。还有另一个第四个解决方案,但没有第二个解决方案有效、灵活和整洁:define col(!positional!charend('/')/!positional!cmdend)!做我在(!1)!如果(!i=“v1”)!那么!让我来!sheetname=“工作表A”!伊芬德!如果(!i=“v2”)!那么!让我来!sheetname=“工作表B”!如果。。。ctables/表x1+x2 by!我[指f1.2,总计[指f1.2]。。。输出导出/内容导出=可见/xlsx documentfile=“E:\path\file.xlsx”操作=创建工作表=!姓名!多恩德!enddefine.**宏调用。col v1 v2.
对于这个例子来说,这是可行的,但缺点是它在新情况下不会是动态的……是的,的确如此。这就是为什么解决方案2是最好的。
col VARa/ "sheet 1" .
col VARb/ "sheet 2" .