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”,您必须像我的示例一样单独列出所有变量。