SPSS CTables通过宏

时间:2017-01-17 13:38:01

标签: macros spss

我是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. 

非常感谢任何帮助 - 没有提供样本数据。只需要在正确的方向上提示。

2 个答案:

答案 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",您必须按照我的示例单独列出所有变量。