Macros 将compute、loop和concat结合起来

Macros 将compute、loop和concat结合起来,macros,spss,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

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

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变量命令在SHIFT=0时是理想的,但该命令不能在循环中使用。不幸的是,compute concatX,“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.
BEGIN PROGRAM.
import spss,spssaux

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

spss.SetMacroValue('!varlist', ' '.join(varlist))
END PROGRAM.
在这里,我使用了recodeinto命令,而不是一个COMPUTE和一个RECODE命令。但当然原则是如何使用的!CONCAT命令与COMPUTE操作相同

但是,您不能这样调用宏!recodeVars vars=v3a至v3z。在这种情况下,宏将尝试对变量v3a、TO和v3z执行重新编码。您必须使用要重新编码的所有变量列表调用此宏

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

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

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.
BEGIN PROGRAM.
import spss,spssaux

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

spss.SetMacroValue('!varlist', ' '.join(varlist))
END PROGRAM.
这将创建一个名为!varlist,在调用时扩展为变量列表

你现在可以打电话了!按以下方式录制宏:!雷科德瓦尔斯=!瓦利斯

如果您没有安装python插件,并且不想使用手动键入或复制粘贴,那么可以使用


顺便说一句,您也可以使用宏来执行SHIFT VALUES命令。

谢谢您的回答!你帮了我很多。