0

我有几个数据集,我想在这些数据集上运行相同的命令。我的基本想法是使用我的 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' .....
}
4

3 回答 3

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 解决方案如下所示(您需要将 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 解决方案要简单得多。

于 2015-07-08T10:28:00.213 回答
0

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

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

于 2015-07-08T16:13:09.837 回答
0

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

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

于 2015-07-09T14:16:22.860 回答