SPSS – 拆分字符串变量

作者:Ruben Geert van den Berg,发表于 SPSS Blog

在将一些数据导入 SPSS 后,某些答案最终出现在单个字符串变量中。数据位于 splitstrings.sav 中,部分数据如下所示。Excel 有一个很好的“文本到列”功能来拆分它,但 SPSS 没有……所以你认为你可以用语法来解决?那么让我们开始将这个字符串拆分成原始答案。

SPSS 拆分字符串文本到列数据视图

步骤 1 - 新的字符串变量

首先,我将做两个猜测:

  • 我猜我的长字符串变量肯定不会包含超过 30 个答案;
  • 我猜这些答案中没有一个超过 25 个字符。或者 - 在 SPSS Unicode 模式下 - 25 个字节。这通常对应于 25 个字符。

如果我的猜测是正确的,那么 30 个新的字符串变量 - 每个长度为 25 - 应该能够容纳所有答案。但不用担心:如果我的猜测是错误的,我会在执行字符串拆分练习后发现。

步骤 2 - 拆分字符串语法

我们将通过以一种稍微不寻常的方式结合 VECTOR 和 LOOP 来拆分我们的字符串。那些觉得困难的人可能想看看 带有注释的长版本 。

***新建字符串变量:创建比你预期需要的更多,并且更长。**
STRING emo_1 TO emo_30 (A25).

***拆分字符串:每个“;”表示一个新的答案。**
STRING #char(A1).
COMPUTE #index = 1.
VECTOR emo = emo_1 TO emo_30.

LOOP #pos = 1 TO CHAR.LENGTH(emotions).
COMPUTE #char = CHAR.SUBSTR(emotions,#pos,1).
IF(#char <> ";") emo(#index) = CONCAT(RTRIM(emo(#index)),#char).
IF(#char = ";") #index = #index + 1.
END LOOP.
EXECUTE.

结果

SPSS 拆分字符串文本到列结果

步骤 3 - 检查结果

对于我们的 30 个新的 emo_ 变量中的每一个,我们现在将创建一个数值变量,其中包含字符串值的长度。如果我对答案的数量及其长度的猜测是正确的,那么:

  • 这些检查变量中没有一个应该包含超过 24 的长度。如果它们这样做,那么一些原始答案可能已被截断
  • 最后一个检查变量应该只包含零。这意味着最后一个新的字符串变量是空的,这意味着 30 个新的变量确实足够了。如果不是这种情况,我可能创建了不足的新变量

用于检查结果的语法

***对于每个新字符串,创建数值变量,指示字符串长度。**
DO REPEAT #old = emo_1 TO emo_30 / #new = len_1 TO len_30.
COMPUTE #new = CHAR.LENGTH(#old).
END REPEAT.

***最大值 <= 24 的变量没有被截断,因为我们的新字符串都有长度 25。**
DESCRIPTIVES len_1 TO len_30.

结果

SPSS 拆分字符串变量文本到列描述统计

只有前 15 个新变量包含非零值。回顾来看,仅 15 个(而不是 30 个)新的字符串变量就足够了。嘿,但难道不是一切事情回顾起来总是看起来更好吗?其次,我们的新字符串变量中没有一个包含超过 9 个字符/字节的值。没有值被截断。这两个检查证实我们的操作已完全成功。现在让我们清理一下。

步骤 4 - 删除冗余变量

***最大值为 0 的变量表示空字符串变量:emo_16 及之后的变量。我们将删除这些变量和我们的临时长度变量。**
DELETE VARIABLES emo_16 TO len_30.

***我们现在将所有字符串变量设置为其最小所需长度。**
ALTER TYPE ALL(A=AMIN).

带有注释的拆分语法

对于那些觉得拆分语法有点困难的人,我在下面的版本中添加了一些注释。提示:将其复制粘贴到 Notepad++ 中以方便阅读。

***新建字符串变量:创建比你预期需要的更多,并且更长。**
STRING emo_1 TO emo_30 (A25).

***由于我们将循环原始字符串中的字符,我们将把每个字符传递到临时变量 #char 中,以便于引用。**
STRING #char(A1).

***设置一个向量(vector)。现在可以将新的字符串变量引用为 emo(1)、emo(2) 等。**
VECTOR emo = emo_1 TO emo_30.

***设置新的字符串变量的计数器 #index。**
COMPUTE #index = 1.

***现在 emo(#index) 指的是 emo_1。在将 1 添加到 #index 后,emo(#index) = emo_2。等等。**
***循环原始字符串中的所有字符。**
LOOP #pos = 1 TO CHAR.LENGTH(emotions).

***将字符传递到 #char 中。**
COMPUTE #char = CHAR.SUBSTR(emotions,#pos,1).

***如果 #char 不是“;”,则将字符添加到正在构造的 emo 变量的末尾。**
IF(#char <> ";") emo(#index) = CONCAT(RTRIM(emo(#index)),#char).

***如果 char 是“;”,则继续使用下一个新的字符串变量。**
IF(#char = ";") #index = #index + 1.
END LOOP.
EXECUTE.

最后的说明

希望你像我一样喜欢这个有趣的小练习。但你可能没有。感谢阅读!