SPSS:使用 Python 编辑值标签
作者:Ruben Geert van den Berg,归属于 SPSS Python 基础
一家本地超市进行了一项小型调查,其数据位于 minisurvey.sav 文件中。不幸的是,用于将数据下载为 SPSS 格式的软件在所有变量和值标签前都添加了变量名称作为前缀。下面的截图显示了部分数据。
值标签中不需要的前缀
在变量视图(Variable View)中点击一些值标签,确认它们确实有不需要的前缀,如下图所示。显然,我们不希望在输出中看到这些值标签,但我们也不想手动调整所有这些标签。幸运的是,SPSS 与 Python 允许我们仅用几行代码解决这个问题。
使用 Python 移除字符
首先,您需要正确安装 SPSS Python Essentials 才能运行本教程的语法。我们将首先创建一个字符串,其中只包含一个值标签。我们将通过在 Python 中提取子字符串来调整它。准确地说,我们想要提取第 9 个字符到最后一个字符之间的内容。由于 Python 从 0 开始计数,因此 valLab[8:]
正好可以实现这一点。
# Python 子字符串提取第 9 个字符到最后一个字符
begin program python3.= 'v13_2A: Neutral'
valLab print(valLab[8:])
end program.
查找标签中的冒号
不幸的是,我们的前缀长度不同,所以我们不能仅仅提取第 9 个字符到最后一个字符。但是,我们_确实_看到前缀总是以冒号和一个空格结尾。使用 find
可以找到(第一个)冒号的位置,它会告诉我们提取哪些字符。
# 查找(第一次出现的)": "
begin program python3.print(valLab.find(": "))
end program.
修复一个值标签
我们的冒号和空格出现在位置 6。因为我们希望标签从这两个字符_之后_开始,所以我们将再加 2,如下所示。简而言之,valLab[valLab.find(": ") + 2:]
总是返回所需的值标签。
# 从 1 个值标签中删除前缀
begin program python3.= 'v1: Neutral'
valLab print(valLab[valLab.find(": ") + 2:])
end program.
结果
查找 SPSS 字典信息
我们可以使用 Python 的 spss
模块轻松查找 SPSS 字典信息。一些例子是:
spss.GetVariableName(ind)
spss.GetVariableLabel(ind)
spss.GetVariableType(ind)
spss.GetVariableFormat(ind)
其中 ind
是 Python 变量索引(0 表示第一个变量,1 表示第二个变量,依此类推)。但是,对于值标签,我们更喜欢使用 spssaux
模块中的 VariableDict()
。但我们先来查找所有的变量名。
# 使用 spssaux.VariableDict() 检查变量信息
begin program python3.import spssaux
= spssaux.VariableDict()
sDict for var in sDict:
print(var,type(var))
end program.
结果
查找值标签
现在我们将查找值标签。对于每个变量,我们将获得一个 Python 字典(Python dict object),其中包含每个带标签的值及其标签。不要混淆 Python 的 dict 对象 与 SPSS 字典(SPSS Dictionary);它们完全不相关。
# 检索值标签(Python dict 对象)
begin program python3.import spssaux
= spssaux.VariableDict()
sDict for var in sDict:
= var.ValueLabels
valLabs print(valLabs)
end program.
结果
循环遍历值和标签
Python 的 dict 包含键值对(key-value pairs),其中键(key)在 dict 中是唯一的。我们将循环遍历这些键值对,并使用 items()
查找键和值,如下所示。
# 对于每个变量,循环遍历带有标签的值
begin program python3.import spssaux
= spssaux.VariableDict()
sDict for var in sDict:
= var.ValueLabels
valLabs for key,val in valLabs.items():
print(key,val)
end program.
这里一个主要的混淆点是 SPSS 值 是我们 Python dict 中的 键(keys)。Python dict 值(values) 保存 SPSS 值标签。下图说明了这种映射关系。
创建 ADD VALUE LABELS 命令
到目前为止,我们的语法可以找到所有的变量名、值和值标签。将这些插入到 ADD VALUE LABELS
命令中将为整个数据集设置所有的值标签。我们将通过在一个循环中连接这些命令来创建这个语法。注意,\n
在每一行之后添加一个换行符。
# 创建用于调整所有值标签的基本 SPSS 语法
begin program python3.import spssaux
= ''
spssSyntax = spssaux.VariableDict()
sDict for var in sDict:
= var.ValueLabels
valLabs for key,val in valLabs.items():
+= "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
spssSyntax print(spssSyntax)
end program.
创建用于调整值标签的语法
现在,我们将添加我们之前开发的针对每个值标签的更正。生成的语法_几乎_是我们需要的。如果您在继续阅读之前发现了问题,可以获得奖励。
# 创建用于调整值标签的 SPSS 语法
begin program python3.import spssaux
= ''
spssSyntax = spssaux.VariableDict()
sDict for var in sDict:
= var.ValueLabels
valLabs for key,val in valLabs.items():
= val[val.find(": ") + 2:]
val += "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
spssSyntax print(spssSyntax)
end program.
结果
如果您非常擅长 SPSS,您会看到一些值标签包含单引号。由于标签也包含在单引号中,它们会过早地结束标签。在 Python 中,我们会使用 \'
来转义它们,但这是 SPSS 语法,所以我们需要使用 ''
来代替。
最终语法
现在,我们将用两个单引号替换_值标签内部_的所有单引号。其次,我们将检查我们正在寻找的冒号和空格是否实际存在于每个标签中,如果不存在,我们将跳过它。第三,我们将使用 spss.Submit
运行我们的 SPSS 语法,所以我们需要同时导入 spss
模块和 spssaux
模块。
# 创建并运行最终语法
begin program python3.import spssaux,spss
= ''
spssSyntax = spssaux.VariableDict()
sDict for var in sDict:
= var.ValueLabels
valLabs for key,val in valLabs.items():
if(": ") in val:
= val[val.find(": ") + 2:]
val = val.replace("'","''")
val += "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
spssSyntax
spss.Submit(spssSyntax)
end program.
# 运行此程序后,我们就完成了。
最终说明
我们的最终语法完成了这项工作:在运行 FREQUENCIES(频率分析)或其他命令时,我们的输出中将有美观、干净的值标签。我相信我们的客户会很欣赏的。
语法可以更短,但它简单易懂。您可以轻松地修改它,用于将值标签大写或从中删除不需要的字符。我希望本教程也展示了如何逐步开发 SPSS Python 语法。
感谢您的阅读!