【问题标题】:SPSS - Macro variable that returns max(column)SPSS - 返回最大值(列)的宏变量
【发布时间】:2016-11-24 23:24:04
【问题描述】:

我是 SPSS 宏的初学者,但我找不到任何关于宏变量的一般指南(我显然尝试过 Raynald Levesque 的网站)。

所以我正在尝试编写一个宏变量,它可以为我提供一列的最大值。这个专栏叫做 anmois 这是我写的:

    SET MPRINT=yes /PRINTBACK=yes.
    DEFINE !max (anmois)
    !LET !max = !max(anmois)
    !ENDDEFINE.

它不起作用。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: macros spss


    【解决方案1】:

    您可以使用旧的 skool Ugly Hack 方法或 Python 来实现此目的。我赞同 Jons (JKP) 的 cmets,如果你是第一次学习宏,最好直接跳到 Python。

    我为以下两种方法提供了解决方案。

    /* Generate demo data*/.
    DATA LIST LIST
    / ID V1.
    BEGIN DATA.
    1, 4.56
    2, 6.85
    3, 7.75
    END DATA.
    DATASET NAME dsDemo.
    

    原生 SPSS 'Ugly Hack' 方法:

    /* Using AGGREGATE obtain max value*/.
    DATASET DECLARE dsAggMax. 
    AGGREGATE OUTFILE=dsAggMax /V1_Max=MAX(V1).
    
    
    /* Using WRITE OUTFILE generate the appropriate syntax to define max value as a macro variable*/.
    DATASET ACTIVATE dsAggMax.
    DO IF $CASENUM=1. 
    WRITE OUTFILE='C:\Temp\macro var.sps' /  "DEFINE !MyV1Max()", V1_Max (F8.3), " !ENDDEFINE.".
    END IF.
    EXECUTE.
    
    /* Run the generated syntax file*/.
    INSERT FILE='C:\Temp\macro var.sps'.
    
    /*Use the defined macro in whatever context you wish*/.
    DATASET ACTIVATE dsDemo.
    COMPUTE IsMax_1WrtSyn=V1=!MyV1Max.
    

    Python 方法:

    BEGIN PROGRAM PYTHON.
    import spssdata
    #Step1: Get all values in from desired variable V1
    s1=spssdata.Spssdata("V1", names=False, convertUserMissing=True, omitmissing=True).fetchall()
    print s1 #[(4.56,), (6.85,), (7.75,)]
    
    #Step 2:  Retrieve just the first item holding the data value from each tuple
    s2=[i[0] for i in s1]
    print s2 #[4.56, 6.85, 7.75] 
    
    #Step 3: Get the maximum value from these values
    s3=max(s2)
    print s3 #7.75
    
    #Step 4a: Use this maximum value stored in a python variable to execute desired job
    spss.Submit("COMPUTE IsMax_2Py=V1=%(s3)s." % locals())
    
    #Alternatively
    
    #Step4b: Create a DEFINE macro variable storing the max value to use outside of python and in native SPSS syntax
    
    spss.SetMacroValue("!MyV1Max_PyGen", s3)
    END PROGRAM PYTHON.
    
    /* Use the python generate macro in Step4b outside of python*/.
    COMPUTE IsMax_3PyGen=V1=!MyV1Max_PyGen.
    

    【讨论】:

    • 好的,我明白了,非常感谢!我想我认为宏像 VBA 一样工作......
    • 不是这么简单的比较。但正如 Eli-k 总结的那样,SPSS 中的宏仅仅是为语法处理生成字符串,而不是读取数据。
    【解决方案2】:
    1. 没有宏函数!max,因此没有理由假设您的宏会做任何事情。
    2. 宏函数本身并不操作或分析数据 - 它们只创建语法,然后由语法进行操作和分析。
    3. 您不需要宏来计算列的最大值 - 使用 aggregate 函数。如果您仍然想通过宏来执行此操作,请让宏创建聚合函数。

    【讨论】:

    • 1.所以你不能在宏中使用常规的 SPSS 函数(如 max()、concat() 等)?这很奇怪,因为我不明白聚合之类的命令和 max() 之类的函数之间的区别。对我来说,它们都是命令。
    • SPSS 宏命令用于自动创建语法,例如您可以创建一个复杂的过程,包括aggregatemax() 以及任何其他语法命令,然后在您希望的任何时候使用一个宏调用来运行它。所以所有的宏命令都是关于创建语法的文本,有些类似于用于文本操作的常规语法,但它们都没有真正触及数据。因此宏为aggregatemax() 创建语法,但这些命令不是宏语言的一部分,也不是宏的一部分。
    【解决方案3】:

    如果您刚开始使用宏,我建议您改为学习 Python for SPSS。它更强大。您可以从 IBM Predictive Analytics Community 网站下载 Programming and Data Management 一书。它展示了如何将该语言用于典型的 SPSS 任务。所有功能的详细信息也可以在帮助中找到。

    宏文档不是很好,但您可以在 DEFINE 下阅读它,以及在帮助菜单中访问的命令语法参考的后面部分中阅读它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2011-04-15
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多