SPSS:在引号内使用索引变量

时间:2015-07-08 09:13:55

标签: loops indexing spss quotation-marks

我有几个数据集,我想在其上运行相同的命令。  我的基本想法是使用我的GET命令中的指定名称创建一个带有数据集名称的向量并在其上循环:

VECTOR=(9) D = Name1 to Name9.
LOOP #i = 1 to 9.
     GET 
     FILE = Directory\D(#i).sav
     VALUE LABELS V1 to V8 'some text D(#i)'
LOOP END. 

现在SPSS没有意识到我希望它使用向量D的特定值。 在Stata我会用

local D(V1 to V8)
foreach D{
    ....`D' .....
}

3 个答案:

答案 0 :(得分:1)

您不能以这种方式使用VECTOR,即在GET循环中使用VECTOR/LOOP命令。

但是您可以使用DEFINE/!ENDDEFINE。这是SPSS的原生宏设施语言,如果您不知道这一点,您很可能需要对其进行大量阅读并理解它的语法用法。

以下是一个例子:

DEFINE !RunJob ()

!DO !i !IN 1 !TO 9
  GET FILE = !CONCAT("Directory\D(",#i,").sav").
  VALUE LABELS V1 to V8 !QUOTE(!ONCAT("some text D(",#i,")",
!DOEND
!ENDDEFINE.

SET MPRINT ON.
!RunJob.
SET MPRINT OFF.

DEFINE!ENDDEFINE之间的所有代码都是宏的主体,接近结尾!RunJob.的语法然后运行并执行宏中定义的那些过程。

这是一个非常简单地使用没有分配参数/参数的宏,但是存在更复杂的范围。

如果你是DEFINE/!ENDEFINE的新手,我实际上建议你不要花时间学习这个,而是学习Python程序能力,与DEFINE /相比,相对容易实现相同(和更多) !ENDDEFINE。

你的例子的python解决方案看起来像这样(你需要与你的SPSS集成Python Programmability):

BEGIN PROGRAM.
for i in xrange(1,9+1):
    spss.Submit("""
    GET FILE = Directory\D(%(i)s).sav
    VALUE LABELS V1 to V8 'some text D(%(i)s)'.""" % locals())
END PROGRAM.

正如您将注意到python解决方案更加简单。

答案 1 :(得分:0)

@Caspar:使用Python for SPSS进行此类工作。 SPSS宏一直被弃用,最好避免使用。

如果您使用Python,则甚至不必输入文件名:您只需在某个文件夹中查找以“.sav”结尾的所有文件名,如this example所示。

HTH!

答案 2 :(得分:0)

Python方法就像Ruben所说的那样优于旧的宏工具,但你可以使用SPSSINC PROCESS FILES扩展命令来执行这样的任务,而无需了解Python。 PROCESS FILES包含在最近版本的Statistics中的Python Essentials中,但可以从旧版本的SPSS社区网站(www.ibm.com/developerworks/spssdevcentral)下载。

您的想法是创建一个适用于一个数据文件的语法文件,PROCESS FILES通过输入文件列表或通配符规范对其进行迭代。对于每个文件,它定义了可以在语法文件中使用的文件句柄和宏来打开和处理数据。