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 在输入文件列表或通配符规范上迭代该文件。对于每个文件,它都定义了文件句柄和宏,您可以在语法文件中使用它们来打开和处理数据。
我有几个数据集,我想对其执行 运行 相同的命令。 我的基本想法是使用我的 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 在输入文件列表或通配符规范上迭代该文件。对于每个文件,它都定义了文件句柄和宏,您可以在语法文件中使用它们来打开和处理数据。