我有许多名称如
的变量PRE_adam
POST_adam
PRE_betty
POST_betty
PRE_clara
POST_clara
...
很多人的名字。
我想计算PRE_X
和POST_X
之间的差异,以获取X
的列表 - 如下所示:
COMPUTE DIFF_adam = POST_adam - PRE_adam
COMPUTE DIFF_betty = POST_betty - PRE_betty
COMPUTE DIFF_clara = POST_clara - PRE_clara
有没有办法在循环中执行此操作?像这样:
DO REPEAT x= adam betty clara
COMPUTE !concat('DIFF_',x) = !concat('POST_',x) - !concat('PRE_',x)
END REPEAT
答案 0 :(得分:6)
您错误地尝试在正常的SPSS语法中使用SPSS的宏语言(DEFINE / !ENDDEFINE),即!concat仅在SPSS宏的主体中使用时才有效。
这是使用DEFINE /!ENDDEFINE的解决方案非python解决方案: 但这需要输入名称。
/*** ############################## ***/.
DATA LIST FREE/ PRE_adam
POST_adam
PRE_betty
POST_betty
PRE_clara
POST_clara.
BEGIN DATA
1 3 15 27 19 31
2 4 16 18 20 42
END DATA.
/*** ############################## ***/.
/*** ############################## ***/.
define !CompDiff (names=!cmdend)
!do !i !in (!names)
compute !concat("DIFF_",!i)=!concat('POST_',!i) - !concat('PRE_',!i).
!doend
exe.
!enddefine.
/*** ############################## ***/.
set mprint on.
!CompDiff names=adam betty clara.
这里有更多的动态"解决方案,它读取活动数据集中的PRE和POST变量并自动计算差异,但取决于python安装设置:
begin program.
import spss, spssaux, spssdata
spss.Submit("set mprint on.")
preVars=spssaux.VariableDict(pattern="PRE",caseless=True).variables
postVars=spssaux.VariableDict(pattern="POST",caseless=True).variables
if len(preVars) != len(preVars):
raise ValueError("Mis-match number of PRE and POST vars")
for preVar, postVar in zip(sorted(preVars),sorted(postVars)):
preName=preVar[preVar.index("_")+1:]
postName=postVar[postVar.index("_")+1:]
if preName != postName:
raise ValueError("Mis-match NAMES of PRE and POST vars")
spss.Submit("compute DIFF_%(preName)s=POST_%(preName)s - PRE_%(preName)s." % locals())
spss.Submit("set mprint off.")
end program.