结合计算、循环和连接

combine compute, loop and concat

我想 运行 对很多变量使用以下语法。因此,我想遍历一堆变量。 语法如下:

compute v3a_mit = v3a.
recode v3a_mit
   (-9998=2) (sysmis=9).
exe.

然而,在这种情况下,语法只涉及变量 "v3a"。我还有一些其他变量(v3b、v3c、v3d...),我想对其执行此语法。

所以,循环应该是这样的。

DO REPEAT X=v3a to v3z
    compute concat(X,'_mit') = X.
    recode concat(X,'_mit')
       (-9998=2) (sysmis=9).
    exe.
END REPEAT.

因此,在循环内,应创建新变量,并根据循环中执行的变量获得新名称。 "SHIFT VALUES VARIABLE" 命令将是理想的(shift=0),但此命令不能在循环中使用。不幸的是 "compute concat(X,'_mit')" 也不起作用。

CONCAT是一个操作字符串变量值的函数。所以你不能用它来定义变量名。

但是您可以在 SPSS 宏中使用 !CONCAT 函数。

您可以使用以下宏重新编码一组变量。

DEFINE !recodeVars (vars = !CMDEND)
    * for every variable in the 'vars' list do the RECODE INTO command.
   !DO !var !IN (!vars)
      RECODE !var (-9998=2) (sysmis=9) INTO !CONCAT(!var, '_mit').
   !DOEND
!ENDDEFINE.

* macro call.
!recodeVars vars = v3a v3b v3c v3d.

在这里,我使用了 RECODE INTO 命令,而不是一个 COMPUTE 和随后的 RECODE 命令。但是当然,如​​何使用 !CONCAT 命令的原理对于 COMPUTE 操作是相同的。

但是你不能像这样调用宏!recodeVars vars = v3a TO v3z.在那种情况下,宏会尝试对变量执行RECODE "v3a" , "TO" 和 "v3z"。您必须使用要重新编码的整个变量列表来调用此宏。

这可能需要大量输入。作为避免输入的简单方法,您可以通过 SPSS 菜单生成 SPSS 命令(例如 Analize -> Descreptive Statistics -> Frequencies)然后 select 您要重新编码的变量(select第一个变量,按住 SHIFT 键和 select 最后一个变量)然后按粘贴按钮。带有变量列表的 Frequency 命令将被粘贴到您的语法中。您现在可以将变量列表复制粘贴到您的宏调用中。

如果您安装了 Python 集成插件,您还可以使用这个小 python 块来检索两个变量之间的 varlist。

BEGIN PROGRAM.
import spss,spssaux

variables = 'v3a to v3z' #Specify variables
varlist = spssaux.VariableDict().expand(variables)

spss.SetMacroValue('!varlist', ' '.join(varlist))
END PROGRAM.

这会创建一个名为“!varlist”的宏,调用时会扩展为变量列表。

您现在可以通过以下方式调用“!recodeVars”宏:!recodeVars vars = !varlist.

如果您没有安装 python 插件(并且不想使用手动输入或复制和粘贴),您可以使用 "!DefList" macro from Raynald's SPSS Tools.


顺便说一下,您还可以为 SHIFT VALUES 命令使用宏。