我是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.
非常感谢任何帮助 - 没有提供样本数据。只需要在正确的方向上提示。
答案 0 :(得分:2)
DEFINE / ENDDEFINE的文档指南一开始可能有点吓人,因此要了解它的所有功能,最好先使用示例。
我在下面分享三个例子,它们可以告诉你可能出错的地方:
GET FILE="C:\Program Files\IBM\SPSS\Statistics\24\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编写代码(以及许多其他好处)。
答案 1 :(得分:2)
首先,如果您使用名称" !usevar
"定义宏,则必须在语法中使用相同的名称 - " usevar
& #34;不会做的。
无论如何,我建议采用不同的宏观方法:
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.
现在,您可以调用宏来为每个变量创建一个表,例如:
!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
",您必须按照我的示例单独列出所有变量。