从 SPSS 中的所有变量名中去除前缀

Strip prefix from all variable names in SPSS

我有一个与此处 () 类似的问题,那里的答案已经帮了大忙,但还剩下一个问题。

我有一个数据集,其中每个变量名称都有前缀 "v23_1_"。我想从所有变量中删除此前缀,但它们有数百个,所以我正在寻找一种无需数百次使用 RENAME 语句即可完成此操作的方法。

我使用了这个代码:

begin program.
vdict=spssaux.VariableDict()
mylist=vdict.range(start="v23_1_dg_mnpdocid", end="v23_1_phq9t0_asku3t0")
nvars = len(mylist)

for i in range(nvars):
    myvar = mylist[i]
    mynewvar = myvar.strip("v23_1_")
    spss.Submit(r"""
        rename variables ( %s = %s) .
                        """ %(myvar, mynewvar))
end program.

这是前几个变量的列表:

v23_1_dg_mnppusid
v23_1_dg_sigstatus
v23_1_dg_mnpvsno
v23_1_dg_mnpvslbl
v23_1_dg_mnpcvpid
v23_1_dg_mnpvisid
v23_1_dg_mnpvisno
v23_1_dg_mnpvispdt
v23_1_dg_mnpvisfdt
v23_1_dg_mnpfs0
v23_1_dg_mnpfs1
v23_1_dg_mnpfs2
v23_1_dg_mnpfs3
v23_1_dg_mnpfcs0
v23_1_dg_mnpfcs1
v23_1_dg_mnpfcs2

它对第一个变量工作正常,但随后停止并显示消息 "renaming has created two variables named dg_mnpfs"。但是剥离后的下一个变量将具有名称 "dg_mnpfs2"。发生的事情是 "v23_1_dg_mnpfs1" 中末尾的 1 也被删除了。然后它可能还打算删除 "v23_1_dg_mnpfs2" 中末尾的 2,这将导致相同的变量。我不明白为什么会发生这种情况以及如何避免这种情况。

非常感谢您的支持! 亲切的问候, 击败

按照您现在的语法,它将在 variable-by-variable 的基础上 运行。您 submitting/running RENAME VARIABLES 命令的次数与列表中变量的数量一样多。 一方面,这是 in-efficient,因为 运行 比我在下面建议的时间更长。 另一方面(也是更重要的)一方面,逐个变量执行它并不能防止重复变量。我猜您的数据文件中已经有一个名为 dg_mnpfs 的变量,并且您正试图通过重命名 v23_1_dg_mnpfs 来创建一个新变量。在您的 python 代码中断后,只需检查您的数据文件。

编写代码的一种更有效的方法是创建包含旧名称和新名称的列表,并仅使用一个命令提交语法。

begin program.
import spss,spssaux
vdict=spssaux.VariableDict()
mylist=vdict.range(start="v23_1_dg_mnpdocid", end="v23_1_phq9t0_asku3t0")
nvars = len(mylist)

my_new_list=[]
for i in range(nvars):
    myvar = mylist[i]
    mynewvar = myvar.strip("v23_1_")
    my_new_list.append(mynewvar)

my_syntax="ren var (" + " ".join(mylist) + "=" + " ".join(my_new_list) +")."
spss.Submit(my_syntax)
end program.

还有一件事:strip 函数从变量的两端删除文本。如果只想删除前缀,请考虑使用 lstrip。详情可见here, in the official documentation.

这是使用 SPSS 宏的流程版本。使用 SPSSINC SELECT VARIABLES 可以让您获得所有相关变量的完整列表,无论它们的顺序如何,而无需在命令中命名它们:

*this is just to create a sample data to play with.
data list list/v23_1_var1 to v23_1_var6.
begin data
end data.

以下创建相关变量的列表:

SPSSINC SELECT VARIABLES MACRONAME="!list" /PROPERTIES  PATTERN = "v23_1_*".
* the following macro creates one rename command for all the list. 
define !doRename ()
rename variables (!eval(!list)=!do !i !in(!eval(!list)) !substr(!i, 7) !doend).
!enddefine.
!doRename .