SPSS – 拆分字符串变量
作者:Ruben Geert van den Berg,发表于 SPSS Blog。
在将一些数据导入 SPSS 后,某些答案最终出现在单个字符串变量中。数据位于 splitstrings.sav 中,部分数据如下所示。Excel 有一个很好的“文本到列”功能来拆分它,但 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.
结果
步骤 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.
结果
只有前 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.
最后的说明
希望你像我一样喜欢这个有趣的小练习。但你可能没有。感谢阅读!