SPSS LOOP – 快速教程与示例
作者:Ruben Geert van den Berg,归属于SPSS A-Z
LOOP
是一个 SPSS 命令,用于重复执行一个或多个 SPSS 转换命令。SPSS LOOP
经常与 VECTOR 命令一起使用。一个(通常)更简单的替代方案是 DO REPEAT
。
- 在 SPSS 中有几种循环的方式。具体使用哪种取决于具体情况。请注意,这些选项仅在 syntax (语法) 中可用。
- 用于转换的循环选项是
LOOP
命令。我们将在本教程稍后用一些例子来解释它。 - 用于转换的第二个选项是
DO REPEAT
命令。 - 对于过程的循环,推荐使用 Python 。对于一个非常基本的例子,请参见 Regression over Many Dependent Variables (对多个因变量进行回归) 。
示例:将双空格替换为单空格
- 假设我们有包含句子的数据。这些句子包含双空格、三空格(等等),我们想将它们替换为单空格。
- 本例的测试数据通过运行下面的 syntax (语法) 创建。
***创建迷你测试数据集。
**
data list free/sentence(a45).
begin data
'a b c d e f g h i'
end data.
SPSS LOOP - 最小化规范
- 请注意,简单地将双空格替换为单空格是不够的。这是因为如果在遇到三空格及以上时,替换过程可能会创建“新”的双空格。
- 但是,如果我们重复执行此替换,所有双空格最终都会消失。最基本的方法是简单地将替换放在一个循环中。
- SPSS
LOOP
命令指示应重复执行后续命令。反之,END LOOP
指示其后的命令不必重复执行。 - 下面的语法演示了
LOOP
的最基本用法。我们将使用 REPLACE (替换) 函数来删除双空格。
SPSS LOOP 语法示例 1
***错误的方法(触发警告 #534)将双空格替换为单空格。
**
loop.
compute sentence = replace(sentence,' ',' ').
end loop.
execute.
LOOP 索引变量
- 前面的语法示例可以完成其工作,但效率非常低,甚至会引发警告(#534)。这是因为没有任何东西告诉 SPSS 在某个时刻停止循环,除非预定义的最大循环次数。
- 避免这种情况的一个非常基本的方法是使用 loop index (循环索引) 变量。这是一个值在迭代过程中变化的变量。这样,我们可以精确地指定我们想要对命令执行多少次迭代。
- 假设我们的句子最多包含 8 个连续空格,我们只需要重复执行替换命令 3 次。在第一次迭代中,8 或 7 个相邻空格将变为 4 个空格。第二次迭代会将这 4 个空格替换为两个空格。在最后一次迭代中,这两个空格将被替换为一个空格。
- 为了演示,重新创建第一个示例中的测试数据并尝试以下语法。
SPSS LOOP 语法示例 2
***将双空格替换为单空格,精确执行三次。
**
loop repetition = 1 to 3.
compute sentence = replace(sentence,' ',' ').
end loop.
execute.
LOOP 索引作为暂存变量 (Scratch Variable)
- 上面的示例基本上按如下方式工作:变量 ‘repetition’ 取值为 1,并执行替换命令。接下来,它取值为 2,并第二次执行替换命令。‘Repetition’ 变为 3,并进行第三次迭代。
- 接下来,‘repetition’ 变为 4,但由于这超过了我们设置的阈值 3,循环停止,并且不会执行第四次替换命令。
- 对于手头的数据,三次迭代已经足够了。但是,我们的数据最终会有一个无用的循环索引(“repetition”)。我们可以在循环后删除它,但更常见的解决方案是确保它从一开始就不显示。
- 这可以通过使用 scratch variable (暂存变量) 作为循环索引来完成。简而言之,只需以“#”开头变量名,它就不会显示。
- 这样,你可以使用
#repetition
而不是repetition
。在实践中,你经常会看到#i
(i 代表 index) 被用作循环索引。但是,仅仅#
也是暂存变量的有效名称,所以我们将坚持使用它。 - 以下语法演示了这些点。
SPSS LOOP 语法示例 3
***将双空格替换为单空格,精确执行三次。
**
loop # = 1 to 3.
compute sentence = replace(sentence,' ',' ').
end loop.
exe.
END LOOP IF
- 上一个语法示例还不错,但它有两个问题。首先,我们需要提前知道我们需要多少次循环。情况并非总是如此。为了确保足够的迭代,我们可以简单地循环大量次数,但这可能会减慢大型数据集的处理速度。
- 其次,如果有很多案例,那么可能有些案例比其他案例需要更多的迭代。
- 通过删除循环索引可以考虑这两个方面。相反,一旦每个案例不再有双空格,我们将结束循环。在每次迭代期间,我们将使用 INDEX (索引) 函数检查是否是这种情况,当双空格不存在时,它将返回 0。以下语法演示了这一点。
SPSS LOOP 语法示例 4
***当双空格不再存在时停止循环。
**
loop.
compute sentence = replace(sentence,' ',' ').
end loop if char.index(sentence,' ') = 0.
exe.
LOOP IF
- 前面的语法示例仍然有一个小缺点:即使句子中根本不存在双空格,它也会执行替换命令。
- 更有效的方法是仅对包含至少一个双空格的案例启动循环。因此,对于某些案例,将进行零次迭代,而对于其他案例,则可能进行三次(或更多)迭代。
- 这可以通过使用
LOOP IF
来完成。循环的条件是双空格的存在。以下语法演示了这一点。
SPSS LOOP 语法示例 5
***如果存在双空格则启动迭代。
**
loop if char.index(sentence,' ') > 0.
compute sentence = replace(sentence,' ',' ').
end loop.
exe.
使用 LOOP 索引
- 之前使用循环索引的语法示例没有在重复的命令中使用此索引。它只是表示每个案例的固定重复次数。
- 但是,索引本身也通常在循环中使用。在迭代过程中,索引被替换为正在循环的每个数字。
- 这在下面的语法中得到了演示(使用与之前示例不同的测试数据)。它将计算每个名称中字母“e”的出现次数。对于每个案例,迭代次数等于其名称中的字母数。
- 如果你不熟悉示例中使用的字符串函数,请参阅我们的 SPSS String Variables Tutorial (SPSS 字符串变量教程) 。
SPSS LOOP 语法示例 6
***1. 创建迷你测试数据集。
**
data list free/name(a10).
begin data
Anneke Martin Stefan
end data.
***2. 通过循环名称中的字母来计算“e”的出现次数。
**
compute count_e = 0.
loop # = 1 to char.length(name).
if char.substr(name,#,1) = 'e' count_e = count_e + 1.
end loop.
exe.
BY 关键字
- 当使用循环索引时,它可以以小于或大于 1 的步长递增/递减。这由
BY
关键字指定。 - 例如,
3 TO 12 BY 3
以 3 为步长从 3 递增到 12。因此,它返回 3、6、9 和 12。 - 当与 VECTOR 结合使用时,这可用于计算变量组的平均值。 就像这样,最后一个语法示例计算 (v1, v2, v3),(v4, v5, v6) 等的平均值。
SPSS LOOP 语法示例 7
***1. 创建迷你测试数据集。
**
data list free/v1 to v12 (12f1.0).
begin data
0 0 0 0 0 1 0 1 1 1 1 1
end data.
***2. 计算 4 个和,每个和针对 3 个相邻变量。
**
vector v = v1 to v12 / s(4).
loop # = 3 to 12 by 3.
compute s(# / 3) = sum(v(#),v(# - 1),v(# - 2)).
end loop.
exe.