使用 Python 在 SPSS 中排序变量

作者:Ruben Geert van den Berg,归类于 SPSS Python 基础

我们进行了一个反应时间实验,人们需要尽快解决 20 个谜题。这 20 个答案和反应时间都存储在一个 SPSS 数据文件中,我们将其命名为 trials.sav。文件的一部分如下所示。

SPSS Python 示例 - 数据视图 Trials.sav

首先,我们只想检查反应时间变量的 直方图。最简单的方法是运行 FREQUENCIES 命令,如下所示。但是,即使对于这个非常小的数据文件,指定正确的变量名也很麻烦。

FREQUENCIES Trial_1_Reaction_Time_Milliseconds
Trial_2_Reaction_Time_Milliseconds Trial_3_Reaction_Time_Milliseconds /* 一直到第 20 个 */
/FORMAT NOTABLE
/HISTOGRAM.

如果我们的反应时间变量是相邻的,我们可以使用 TO 关键字来寻址整个块。因此,我们将使用 ADD FILES 重新排序我们的变量,如 SPSS - 使用语法重新排序变量 中所示。完成这项工作最简单的方法是 ADD FILES FILE */KEEP id to agegroup [反应时间变量在这里] ALL.ALL 指的是我们数据中尚未指定的所有变量——在本例中是所有答案变量。此命令仍然需要拼写出所有反应时间变量,除非我们使用 Python 来完成。让我们首先查找所有变量名,然后从那里开始。

1. 通过索引检索变量名

spss 模块允许我们通过索引检索变量名。现在,我们的数据中有 43 个变量,但 Python 从 0 开始计数。因此,我们的第一个和最后一个变量应该被 Python 索引为 0 和 42。让我们通过运行以下语法来验证是否正确。

begin program python3.
import spss
print(spss.GetVariableName(0))
print(spss.GetVariableName(42))
end program.

2. 检索所有变量索引

所以,如果我们能通过它们的 Python 索引(0 和 42)检索第一个和最后一个变量名,那么如果我们拥有所有索引,我们就可以检索所有变量名。一种标准的做法是使用 range

从技术上讲,range 是一个可迭代的对象,这意味着我们可以循环遍历它。以下语法显示了它是如何工作的。

begin program python3.
for ind in range(10):
    print(ind)
end program.
begin program python3.
import spss
for ind in range(spss.GetVariableCount()):
    print(ind)
end program.

结果

SPSS Python 变量索引输出

3. 检索所有变量名

现在,我们将运行一个非常简单的 Python for 循环来遍历我们的变量索引。在每次迭代中,我们将检索一个变量名,从而得到数据中所有变量的名称。我们将在下一步中过滤掉我们的目标变量。

begin program python3.
import spss
for ind in range(spss.GetVariableCount()):
    print(spss.GetVariableName(ind))
end program.

4. 过滤变量名

在我们创建和运行所需的语法之前,我们仍然需要过滤掉那些变量名中包含“Time”的变量。我们将使用一个非常简单的 Python if 语句来做到这一点。以下语法准确地检索了我们的目标变量。

begin program python3.
import spss
for ind in range(spss.GetVariableCount()):
    varNam = spss.GetVariableName(ind)
    if 'Time' in varNam:
        print(varNam)
end program.

5. 创建包含目标变量的 Python 字符串

我们希望创建一些包含我们在前一个语法中选择的变量的 SPSS 语法。我们将首先将名称传递到一个名为 timeVars 的 Python 字符串中。我们首先将其创建为空字符串,然后将每个变量名和一个空格连接到它。

begin program python3.
import spss
timeVars = ''
for ind in range(spss.GetVariableCount()):
    varNam = spss.GetVariableName(ind)
    if 'Time' in varNam:
        timeVars += varNam + ' '
    print(timeVars)
end program.

小提示:编辑字符串被认为是不好的做法,因为它们是不可变的。我们这样做是因为它保持了事情的简单性。它可以很好地完成工作,除非我们正在处理真正大量的代码——这在 SPSS 中基本上不会发生。

6. 创建所需的 SPSS 语法

我们快到了。现在,我们将创建一个基本的 ADD FILES 命令作为 Python 字符串。在下面的语法中,%s 是一个占位符,我们将用我们的时间变量名替换它。有关此技术的更多详细信息,请参阅 SPSS Python 文本替换教程

begin program python3.
import spss
timeVars = ''
for ind in range(spss.GetVariableCount()):
    varNam = spss.GetVariableName(ind)
    if 'Time' in varNam:
        timeVars += varNam + ' '
    spssSyntax = "ADD FILES FILE */KEEP id to agegroup %s ALL."%timeVars
    print(spssSyntax)
end program.

7. 创建并运行所需的语法

让我们仔细看看我们刚刚创建的语法。它是否完全符合我们的需求?确定吗?然后我们将注释掉 print 命令,并使用 spss.Submit 运行我们的语法。

begin program python3.
import spss
timeVars = ''
for ind in range(spss.GetVariableCount()):
    varNam = spss.GetVariableName(ind)
    if 'Time' in varNam:
        timeVars += varNam + ' '
    spssSyntax = "ADD FILES FILE */KEEP id to agegroup %s ALL."%timeVars
    #print spssSyntax
    spss.Submit(spssSyntax)
end program.

execute.

8. 运行直方图

现在我们已经很好地对变量进行了排序,可以使用 TO 关键字轻松运行所需的直方图,如下所示。

FREQUENCIES Trial_1_Reaction_Time_Milliseconds to Trial_20_Reaction_Time_Milliseconds
/FORMAT NOTABLE
/HISTOGRAM.

虽然我们完成了第一项工作,但我们对疯狂的长变量名感到很不满意。在我们看来,变量名应该简短。关于变量含义的更详细描述应该放在它们的变量标签中。

我们将在下一课中做到这一点。

让我们继续。