【问题标题】:Strip suffix from all variable names in SPSS从 SPSS 中的所有变量名中去除后缀
【发布时间】:2016-01-14 20:12:34
【问题描述】:

我有一个数据集,其中每个变量名称都有后缀“_1”(这样做是为了表示第一个采访时间点)。我想从所有变量中删除这个后缀,但是它们有数百个,所以我正在寻找一种方法来做到这一点,而无需数百次使用 RENAME 语句。

我找到的最接近相关信息的信息来自下面的链接,“用于动态重命名变量的一些 SPSS 循环”。但是,这些示例显示了如何添加后缀或更改前缀,但不删除后缀。

http://www.ats.ucla.edu/stat/spss/code/renaming_variables_dynamically.htm

我已经随 SPSS 一起安装了 Python Essentials 包,尽管我不熟悉 Python。

【问题讨论】:

    标签: python spss


    【解决方案1】:

    这里是 Jignesh 的 Python 程序的一个稍微紧凑的版本。功能相同。

    begin program.  
    import spss, spssaux  
    filteredvarlist=[v.VariableName for v in spssaux.VariableDict(pattern="^.*_1$")]  
    spss.Submit( "rename variables (%s=%s)." %  
        ("\n".join(filteredvarlist), "\n".join([v[:-2] for v in filteredvarlist]))  
    )  
    end program.
    

    【讨论】:

    • 啊,是的,当然,VariableDict 上的模式过滤器! Jon,RENAME VARIABLES 作为多个与单个的速度表现如何?
    • RENAME 只是操纵字典。我预计,无论是单次提交还是多次重命名,您永远无法区分一个和多个重命名之间的时间差异。
    【解决方案2】:

    我不了解 SPSS。快速搜索找到了一个使用 python (http://www.ats.ucla.edu/stat/spss/faq/renaming_vars_Python.htm) 的“使用 Python 重命名变量”的示例

    只需稍作改动,它就会适合您的情况:

    begin program.
    import spss, spssaux
    spssaux.OpenDataFile('d:\data\elemapi2.sav')
    vdict=spssaux.VariableDict()
    mylist=vdict.range(start="grad_sch", end="enroll")
    nvars = len(mylist)
    
    for i in range(nvars):
        myvar = mylist[i]
        mynewvar = myvar.strip("_1")
        spss.Submit(r"""
            rename variables ( %s = %s) .
                            """ %(myvar, mynewvar))
    end program.
    

    【讨论】:

      【解决方案3】:

      尽管UCLA website 上给出的解决方案适用于特定的示例/数据集,但 Python 程序的编码方式可能无法在所有情况下都按预期工作。

      例如,"V01_1".strip("_1") 会错误地生成"V0",而类似"V_1_1".strip("_1") 的东西会简单地生成"V",如果只想去除后缀,也会再次出现错误且不符合预期。

      而且非常关键,即使变量没有 "_1" 后缀,它也会生成冗余的 RENAME VARIABLES 命令(尽管我知道在您的特定示例中您说 all 变量应该)。

      此外,它会为每个变量生成单独的 RENAME VARIABLE 命令,不确定这是否比生成单个 RENAME VARIABLES 命令在速度性能方面存在劣势?尽管如此,如果您需要以这种方式编码,也许我会展示一种不同的编码方式:

      DATA LIST FREE / ID V01_1 V02_1 V03_1 W_1_1 W_2_1 W_3_1.
      BEGIN DATA
      0 11 12 13 21 22 23
      END DATA.
      
      begin program.
      spss.Submit(r"set mprint on.")
      import spss, spssaux
      allvarlist=[str(v) for v in spssaux.VariableDict()]
      filteredvarlist=[v for v in allvarlist if v.endswith("_1")]
      spss.Submit( "rename variables (\n" \
           + "\n".join(filteredvarlist) \
           + "\n=\n" \
           + "\n".join([v[:-2] for v in filteredvarlist]) \
           + ").")
      spss.Submit(r"set mprint off.")
      end program.
      

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多