SPSS CTables 通过宏
SPSS CTables via macro
我是 SPSS 宏的新手。我打算自动化 CTables 生产。在 ctables 中,除了变量之外,一切都保持不变。
我的命令是:
CTABLES
/VLABELS VARIABLES=usevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE usevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=usevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
usevar 是我打算与宏交换的变量。 (例如我的变量是 F5 F6 F7)
所以我尝试了:
DEFINE !usevar()
F1 F5
!ENDDEFINE.
CTABLES
/VLABELS VARIABLES=usevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE usevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=usevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
非常感谢任何帮助 - 未提供示例数据。只需要正确方向的提示。
DEFINE / ENDDEFINE 的文档指南一开始可能有点吓人,因此要了解它的所有功能,最好先尝试一下示例。
我在下面分享三个示例,它们应该可以让您了解可能哪里出错了:
GET FILE="C:\Program Files\IBM\SPSS\Statistics\Samples\English\Employee data.sav".
/* Example1: Using macro as a global string substitution for variable names */.
DEFINE !MyMac1 () educ jobcat !ENDDEFINE.
FREQ !MyMac1.
/* Example2: Having command in the body of macro with variable input as an argument */.
/* Result: Notice only single FREQ command is run with two variables */.
DEFINE !MyMac2 (VARS=!CMDEND).
SET MPRINT ON.
FREQ !VARS.
SET MPRINT OFF.
!ENDDEFINE.
!MyMac2 vars=educ jobcat.
/* Example3: Having command in the body of macro with variable input as an argument */
/* but looping over each variable */.
/* Result: Notice two separate FREQ commands are run */.
/* with one variable each, i.e. looped for each variable */.
DEFINE !MyMac3 (VARS=!CMDEND).
SET MPRINT ON.
!DO !I !IN (!VARS)
FREQ !i.
!DOEND
SET MPRINT OFF.
!ENDDEFINE.
!MyMac3 vars=educ jobcat.
DEFINE/ENDDEFINE
的功能可以以多种方式使用。一旦您对它们有了一些了解,您很快就会形成一种您喜欢如何编写宏代码的特定风格。如果您是第一次学习 SPSS 宏并且有一些知识(或对 Python 感兴趣),那么我建议您不要开始学习 SPSS 宏的旅程,而是学习 python 作为这种类型的使用 Python 编写宏构建效率更高(也更有趣!)(还有许多其他好处)。
首先,如果你用名称“!usevar
”定义宏,你必须在语法中使用相同的名称——“usevar
”不行。
无论如何,我建议对宏使用不同的方法:
define !MyCtabMacro (!pos=!cmdend)
CTABLES
/VLABELS VARIABLES=!1 anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE !1 [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=!1 anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
!enddefine.
现在您可以调用宏为每个变量创建一个 table,例如:
!MyCtabMacro F5.
!MyCtabMacro F6.
如果要对许多变量执行此操作,可以让宏循环遍历它们:
define !MyCtabMacro (!pos=!cmdend)
!do !onevar !in(!1)
CTABLES
/VLABELS VARIABLES=!onevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE !onevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=!onevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
!doend
!enddefine.
现在调用宏:
!MyCtabMacro F5 F6 F7 F8 F9.
注意:对于宏循环,您不能使用“F5 to F9
”,您必须像我的示例一样单独列出所有变量。
我是 SPSS 宏的新手。我打算自动化 CTables 生产。在 ctables 中,除了变量之外,一切都保持不变。
我的命令是:
CTABLES
/VLABELS VARIABLES=usevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE usevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=usevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
usevar 是我打算与宏交换的变量。 (例如我的变量是 F5 F6 F7)
所以我尝试了:
DEFINE !usevar()
F1 F5
!ENDDEFINE.
CTABLES
/VLABELS VARIABLES=usevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE usevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=usevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
非常感谢任何帮助 - 未提供示例数据。只需要正确方向的提示。
DEFINE / ENDDEFINE 的文档指南一开始可能有点吓人,因此要了解它的所有功能,最好先尝试一下示例。
我在下面分享三个示例,它们应该可以让您了解可能哪里出错了:
GET FILE="C:\Program Files\IBM\SPSS\Statistics\Samples\English\Employee data.sav".
/* Example1: Using macro as a global string substitution for variable names */.
DEFINE !MyMac1 () educ jobcat !ENDDEFINE.
FREQ !MyMac1.
/* Example2: Having command in the body of macro with variable input as an argument */.
/* Result: Notice only single FREQ command is run with two variables */.
DEFINE !MyMac2 (VARS=!CMDEND).
SET MPRINT ON.
FREQ !VARS.
SET MPRINT OFF.
!ENDDEFINE.
!MyMac2 vars=educ jobcat.
/* Example3: Having command in the body of macro with variable input as an argument */
/* but looping over each variable */.
/* Result: Notice two separate FREQ commands are run */.
/* with one variable each, i.e. looped for each variable */.
DEFINE !MyMac3 (VARS=!CMDEND).
SET MPRINT ON.
!DO !I !IN (!VARS)
FREQ !i.
!DOEND
SET MPRINT OFF.
!ENDDEFINE.
!MyMac3 vars=educ jobcat.
DEFINE/ENDDEFINE
的功能可以以多种方式使用。一旦您对它们有了一些了解,您很快就会形成一种您喜欢如何编写宏代码的特定风格。如果您是第一次学习 SPSS 宏并且有一些知识(或对 Python 感兴趣),那么我建议您不要开始学习 SPSS 宏的旅程,而是学习 python 作为这种类型的使用 Python 编写宏构建效率更高(也更有趣!)(还有许多其他好处)。
首先,如果你用名称“!usevar
”定义宏,你必须在语法中使用相同的名称——“usevar
”不行。
无论如何,我建议对宏使用不同的方法:
define !MyCtabMacro (!pos=!cmdend)
CTABLES
/VLABELS VARIABLES=!1 anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE !1 [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=!1 anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
!enddefine.
现在您可以调用宏为每个变量创建一个 table,例如:
!MyCtabMacro F5.
!MyCtabMacro F6.
如果要对许多变量执行此操作,可以让宏循环遍历它们:
define !MyCtabMacro (!pos=!cmdend)
!do !onevar !in(!1)
CTABLES
/VLABELS VARIABLES=!onevar anzahl gesamt F0passthrough DISPLAY=LABEL
/TABLE !onevar [C][COLPCT.VALIDN '' PCT40.1] + anzahl [C][COUNT '' F40.0] BY gesamt + F0passthrough
/SLABELS POSITION=ROW
/CATEGORIES VARIABLES=!onevar anzahl ORDER=A KEY=VALUE EMPTY=INCLUDE
/CATEGORIES VARIABLES=gesamt F0passthrough ORDER=A KEY=VALUE EMPTY=EXCLUDE.
filter off.
!doend
!enddefine.
现在调用宏:
!MyCtabMacro F5 F6 F7 F8 F9.
注意:对于宏循环,您不能使用“F5 to F9
”,您必须像我的示例一样单独列出所有变量。