我在这里问了一个类似的问题(Strip suffix 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
它适用于第一个变量,但随后停止并显示消息“重命名已创建两个名为dg_mnpfs的变量”。但剥离后的下一个变量名称为“dg_mnpfs2”。发生的事情是“v23_1_dg_mnpfs1”末尾的1也被删除了。然后它可能也打算在“v23_1_dg_mnpfs2”中删除最后的2,这将导致相同的变量。我不明白为什么会这样,以及如何避免它。
非常感谢您的支持! 亲切的问候, 贝亚特·
答案 0 :(得分:1)
正如您现在看到的语法一样,它将逐个变量运行。您提交/运行RENAME VARIABLES
命令的次数与列表中的变量数一样多。
一方面,这是无效的,因为运行时间比我下面建议的要长。
在另一个(也是更重要的)手上,按变量进行变量,不能防止重复变量。我猜你已经在数据文件中有一个名为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.
答案 1 :(得分:0)
这是使用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 .