【问题标题】:SPSS automated variable labels with leading zeros带有前导零的 SPSS 自动变量标签
【发布时间】:2013-08-15 13:14:31
【问题描述】:

我正在努力采用来自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"

我将非常感谢任何有关如何实现此结果的帮助或建议。

【问题讨论】:

  • 帮自己一个忙,切换到 python 模块。它们更加灵活,您可以询问人们它们有什么问题......
  • @ChristianSauer 好的,使用 python 模块会很容易吗?一个工作样本将不胜感激。我是语法新手,但愿意学习(尤其是任何可以提高生产力的东西,因为我正在写我的学士论文并且时间紧迫)......
  • 不幸的是,我不能保证这很容易,但它看起来很容易。我目前没有时间制作工作样品,抱歉!但是:我猜你是语法新手,想警告你关于旧的宏:很少有人会写它们,而且它们不如 python 宏灵活。甚至学习曲线也好很多,因为 Python 被广泛使用。

标签: spss


【解决方案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,然后生成并运行重命名变量命令。

【讨论】:

    【解决方案2】:

    正如我在 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2015-11-07
      • 2011-01-24
      • 2014-01-03
      • 1970-01-01
      • 2014-03-08
      相关资源
      最近更新 更多