динамически создавать имена переменных в циклах - SPSS

У меня много переменных с такими именами, как

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

person rabensky    schedule 08.01.2015    source источник


Ответы (1)


Вы по ошибке пытаетесь использовать макроязык SPSS (DEFINE / !ENDDEFINE) в обычном синтаксисе SPSS, т. е. !concat работает только при использовании в теле макроса SPSS.

Вот решение, отличное от Python, с использованием DEFINE/!ENDDEFINE: но для этого требуется ввод имен.

/*** ############################## ***/.
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.
person Jignesh Sutar    schedule 08.01.2015