结合计算,循环和concat

时间:2015-03-11 14:07:10

标签: macros spss

我想在很多变量上运行以下语法。因此,我想循环一堆变量。 语法如下:

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)但是此命令不能在循环中使用。不幸的是,“计算concat(X,'_ mit')”也不起作用。

1 个答案:

答案 0 :(得分:0)

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)然后选择要重新编码的变量(选择第一个变量,按住SHIFT键)键并选择最后一个变量)然后按粘贴按钮。带有变量列表的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命令的宏。