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

SPSS: Use index variable inside 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' .....
}

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

但是您可以使用 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. 然后运行并执行宏中定义的那些过程。

这是一个非常简单的宏用法,没有分配 parameters/arguments 但还有更复杂的范围。

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

您的示例的 python 解决方案如下所示(您需要 Python 与 SPSS 的可编程性集成):

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 解决方案要简单得多。

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

如果为此使用 Python,您甚至不必输入文件名:您可以简单地在某个文件夹中查找以“.sav”结尾的所有文件名,如下所示this example.

HTH!

正如 Ruben 所说,Python 方法比旧的宏工具优越得多,但您可以使用 SPSSINC PROCESS FILES 扩展命令来执行此类任务,而无需了解 Python。在最新版本的 Statistics 中,PROCESS FILES 包含在 Python Essentials 中,但在旧版本中可以从 SPSS Community 网站 (www.ibm.com/developerworks/spssdevcentral) 下载。

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