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