【问题标题】:Loop through values of a SPSS variable inside of a Macro循环遍历宏内的 SPSS 变量的值
【发布时间】:2014-08-07 21:42:41
【问题描述】:

如何将特定变量的值传递给宏内的列表处理循环?

假设,作为一个简化示例,我有一个变量 foo,其中包含值 1、4、12、33 和 51。

DATA LIST FREE / foo (F2) .
BEGIN DATA
1 
4 
12 
33 
51 
END DATA.

还有一个用这些值做一些事情的宏。

出于测试原因,此宏只会回显这些值。 我想找到一种方法来运行如下所示的例程:

DEFINE !testmacro (list !CMDEND)
   !DO !i !IN (!list)
     ECHO !QUOTE(!i).
   !DOEND.
!ENDDEFINE.

!testmacro list = 1 4 12 33 51. * <- = values from foo.

【问题讨论】:

  • 鉴于您的问题描述宏(单独)不是要走的路。宏工具无论如何都无法获取数据。

标签: macros spss


【解决方案1】:

在这种情况下,使用 Python api 将是一个不错的选择。

【讨论】:

    【解决方案2】:

    我最近让自己对 Python 有点熟悉了 :-) 所以这就是我的工作。

    如果变量是数字:

    BEGIN PROGRAM PYTHON.
    import spss,spssdata
    foolist = [element[0] for element in spssdata.Spssdata('foo').fetchall()]
    foostring = " ".join(str(int(i)) for i in foolist)
    spss.Submit("!testmacro list = %(foostring)s." %locals())
    END PROGRAM.
    

    如果变量是字符串:

    BEGIN PROGRAM PYTHON.
    import spss,spssdata
    foolist = [element[0].strip() for element in spssdata.Spssdata('bar').fetchall()]
    foostring = " ".join(foolist)
    spss.Submit("!testmacro list = %(foostring)s." %locals())
    END PROGRAM.
    

    变体

    删除重复并排序

    BEGIN PROGRAM PYTHON.
    import spss,spssdata
    foolist = sorted(set([element[0] for element in spssdata.Spssdata('foo').fetchall()]))
    foostring = " ".join(str(int(i)) for i in foolist)
    spss.Submit("!testmacro list = %(foostring)s." %locals())
    END PROGRAM.
    

    删除的重复项和项目在数据集中的首次出现顺序

    这里,我使用了一个从Peter Bengtsson's Homepage (peterbe.com)检索到的函数

    BEGIN PROGRAM PYTHON.
    import spss,spssdata
    
    def uniquify(seq, idfun=None): 
       # order preserving
       if idfun is None:
           def idfun(x): return x
       seen = {}
       result = []
       for item in seq:
           marker = idfun(item)
           if marker in seen: continue
           seen[marker] = 1
           result.append(item)
       return result
    
    foolist = uniquify([element[0] for element in spssdata.Spssdata('foo').fetchall()])
    foostring = " ".join(str(int(i)) for i in foolist)
    spss.Submit("!testmacro list = %(foostring)s." %locals())
    END PROGRAM.
    

    非 Python 解决方案

    不是我推荐它,但甚至有一种方法可以在没有 Python 的情况下做到这一点。 我从一本 SPSS 编程书中得到了基本的想法,内容如下: 使用 WRITE 命令创建一个包含所需命令和变量值​​的文本文件,并将其包含在 insert 命令中。

    DATASET COPY foolistdata.
    DATASET ACTIVATE foolistdata.
    
    AGGREGATE OUTFILE=* MODE=ADDVARIABLES
       /BREAK
       /NumberOfCases=N.
    
    * Variable which contains the command as string in the first case.
    STRING macrocommand (A18).
    IF ($casenum=1) macroCommand = "!testmacro list = ".
    EXECUTE.
    
    * variable which contains a period (.) in the last case, 
    * for the ending of the command string. 
    STRING commandEnd (A1).
    IF ($casenum=NumberOfCases) commandEnd = ".".
    
    * Write the 'table' with the command and variable values into a textfile.
    WRITE OUTFILE="macrocommand.txt" /macrocommand bar commandEnd.
    EXECUTE.
    
    * Macrocall.
    INSERT FILE ="macrocommand.txt".
    

    【讨论】:

    • 每次看到 Python 和 SPSS-macro 语法并排的时候,我不得不佩服 SPSS 语法到底有多糟糕
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多