1

我正在努力的是采用来自http://www.spsstools.net/的语法/宏之一。

它旨在更改没有前导零的“多对多”变量的标签,但我的变量确实有:

DATA LIST LIST /id.
BEGIN DATA
1 
END DATA.

NUMERIC set01sub1 TO set01sub4.
* but the intended variable names are set01sub01 TO set01sub04 (with leading zeros and going over 10).

SET MPRINT=yes.
DEFINE !label (lab=!TOKENS(1)  /stem=!TOKENS(1)  /nb1=!TOKENS(1)  /nb2=!TOKENS(1))
    !DO !cnt=!nb1 !TO !nb2
        !LET !var=!CONCAT(!stem,!cnt)
        !LET !labe=!QUOTE(!CONCAT(!UNQUOTE(!lab),!cnt))
        VARIABLE LABEL !var !labe.
    !DOEND.
!ENDDEFINE.

!label lab='Set 1, subset ' stem=set01sub nb1=1 nb2=4.

我很天真,我尝试过使用!STRING(...,N2)

!LET !labe=!QUOTE(!CONCAT(!UNQUOTE(!lab),!STRING(!cnt,N2)))

但是,这并没有按预期工作

我的变量是

subID
rvnAns_s01m01 TO rvnAns_s01m12
rvnAns_s02m01 TO rvnAns_s02m36
rvnAns_s03m01 TO rvnAns_s03m36

rvnEva_s01m01 TO rvnEva_s01m12
rvnEva_s02m01 TO rvnEva_s02m36
rvnEva_s03m01 TO rvnEva_s03m36

并且预期的标签是:

"Subject ID"


"RAPM, Series 01, Matrix 01 answer"
"RAPM, Series 01, Matrix 02 answer"
...
"RAPM, Series 01, Matrix 12 answer"


"RAPM, Series 02, Matrix 01 answer"
"RAPM, Series 02, Matrix 02 answer"
...
"RAPM, Series 02, Matrix 36 answer"


"RAPM, Series 03, Matrix 01 answer"
"RAPM, Series 03, Matrix 02 answer"
...
"RAPM, Series 03, Matrix 36 answer"

"RAPM, Series 01, Matrix 01 answer evaluation"
"RAPM, Series 01, Matrix 02 answer evaluation"
...
"RAPM, Series 01, Matrix 12 answer evaluation"


"RAPM, Series 02, Matrix 01 answer evaluation"
"RAPM, Series 02, Matrix 02 answer evaluation"
...
"RAPM, Series 02, Matrix 36 answer evaluation"


"RAPM, Series 03, Matrix 01 answer evaluation"
"RAPM, Series 03, Matrix 02 answer evaluation"
...
"RAPMs, Series 03, Matrix 36 answer evaluation"

对于如何实现这样的结果,我将非常感谢任何帮助或建议。

4

2 回答 2

1

如果您通过 SPSS 社区网站 (www.ibm.com/developerworks/spssdevcentral) 安装 Python Essentials,以下程序将转换变量名。

它做了两个假设: 1) 没有一个名称的形式只有前导零,例如 x0y1。(这可以通过稍微复杂一点来解决 2)所有重命名都不会导致名称冲突。3) 所有扩展名称都不会超过名称的最大长度(64 字节)。

程序下面的解释。

begin program.
import spss, re 

for v in range(spss.GetVariableCount()):
  vname = spss.GetVariableName(v)
  vnamenew = re.sub(r"(\D)([1-9])", r"\g<1>0\g<2>", vname)
  if vname != vnamenew:
    spss.Submit("rename variables (%s=%s)" % (vname, vnamenew))
    print vname, "->", vnamenew
end program.

该程序遍历所有变量名。对于每一个,它都会查找所有出现的 nondigit-nonzerodit 并将其替换为 nondigit-0-digit,然后生成并运行重命名变量命令。

于 2013-08-20T02:27:45.557 回答
0

正如我在对crossvalidated的评论中所说,如果您提供stem带有前导零的令牌,您的代码确实适用于给定的示例,例如stem=set01sub0.

但是,如果您的范围跨越 10 位以上,我认为您不会有 10+ 的值的前导零。下面我在 MACRO 中有一个示例,它使用条件评估来连接低于 10 的值的前导零。如果您可能有更多的值(例如进入 100,因此有两个前导零),则需要对其进行修改。

DATA LIST LIST /id.
BEGIN DATA
1 
END DATA.
NUMERIC set01sub01 TO set01sub15.

DEFINE !label (lab=!TOKENS(1)  /stem=!TOKENS(1)  /nb1=!TOKENS(1)  /nb2=!TOKENS(1))
    !DO !cnt=!nb1 !TO !nb2
        !IF (!LENGTH(!cnt) = 1) !THEN
            !LET !cnt0 = !CONCAT("0",!cnt)
        !ELSE
            !LET !cnt0 = !cnt
        !IFEND
        !LET !var=!CONCAT(!stem,!cnt0)
        !LET !labe=!QUOTE(!CONCAT(!UNQUOTE(!lab),!cnt0))
        VARIABLE LABEL !var !labe.
    !DOEND.
!ENDDEFINE.

PRESERVE.
SET MPRINT ON.
!label lab='Set 1, subset ' stem=set01sub nb1=1 nb2=15.
RESTORE.
于 2013-08-19T13:37:44.083 回答