【问题标题】:SPSS CTables via macroSPSS CTables 通过宏
【发布时间】:2017-01-17 13:38:00
【问题描述】:

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

非常感谢任何帮助 - 没有提供示例数据。只需要一个正确方向的提示。

【问题讨论】:

    标签: macros spss


    【解决方案1】:

    首先,如果您使用名称“!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.
    

    现在您可以调用宏来为每个变量创建一个表,例如:

    !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”,您必须按照我的示例分别列出所有变量。

    【讨论】:

      【解决方案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 编写代码(还有许多其他好处)。

      【讨论】:

      • 非常感谢您提供的示例,我一定会熟悉语法和宏逻辑....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多