使用 Python 在 SPSS 中排序变量
作者:Ruben Geert van den Berg,归类于 SPSS Python 基础
我们进行了一个反应时间实验,人们需要尽快解决 20 个谜题。这 20 个答案和反应时间都存储在一个 SPSS 数据文件中,我们将其命名为 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.
结果
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()):
= spss.GetVariableName(ind)
varNam 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()):
= spss.GetVariableName(ind)
varNam if 'Time' in varNam:
+= varNam + ' '
timeVars 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()):
= spss.GetVariableName(ind)
varNam if 'Time' in varNam:
+= varNam + ' '
timeVars = "ADD FILES FILE */KEEP id to agegroup %s ALL."%timeVars
spssSyntax print(spssSyntax)
end program.
7. 创建并运行所需的语法
让我们仔细看看我们刚刚创建的语法。它是否完全符合我们的需求?确定吗?然后我们将注释掉 print
命令,并使用 spss.Submit
运行我们的语法。
begin program python3.import spss
= ''
timeVars for ind in range(spss.GetVariableCount()):
= spss.GetVariableName(ind)
varNam if 'Time' in varNam:
+= varNam + ' '
timeVars = "ADD FILES FILE */KEEP id to agegroup %s ALL."%timeVars
spssSyntax #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.
虽然我们完成了第一项工作,但我们对疯狂的长变量名感到很不满意。在我们看来,变量名应该简短。关于变量含义的更详细描述应该放在它们的变量标签中。
我们将在下一课中做到这一点。
让我们继续。