SPSS 字符串变量教程
作者:Ruben Geert van den Berg (SPSS String Variables)
在 SPSS 中处理字符串变量(string variables)如果掌握了一些基本的字符串函数,就会变得非常简单。本教程将快速介绍一些重要的函数。
SPSS 主要字符串函数
CHAR.SUBSTR
(substring,子字符串) - 从字符串中提取字符CONCAT
(concatenate,连接) - 连接字符串CHAR.INDEX
- 查找字符在字符串中首次出现的位置CHAR.RINDEX
(right index,右索引) - 查找字符在字符串中最后一次出现的位置REPLACE
- 将字符串中的字符替换为不同的字符CHAR.LENGTH
- 返回字符串中的字符数LTRIM
(left trim,左修剪) - 删除前导空格(或极少数情况下的其他字符)RTRIM
(right trim,右修剪) - 删除尾随空格(或极少数情况下的其他字符)LOWER
(lower case,小写) - 将所有字母转换为小写UPCASE
(upper case,大写) - 将所有字母转换为大写
SPSS 语法示例
我们要求受访者输入他们的名字(first name)、姓氏前缀(surname prefix)和姓氏(last name)。我们希望将这些信息合并为完整的姓名,并纠正一些不规范之处,例如不正确的大小写和多余的空格。为了创建一些测试数据,请关闭所有打开的数据集,并运行以下语法(syntax):
***创建迷你测试数据集。
**
set unicode off.
data list free/s1 s2 s3 (3a20).
begin data
'ANNEKE' ' VAN DEN ' 'BERG' 'daan' '' 'balvert' 'a' '' 'b'
end data.
1. 纠正名字
- 一种方法是首先单独纠正每个姓名组成部分,然后将它们组合起来。
- 对于手头的数据,名字应该以大写字母开头,其余字母应该小写。
- 我们将把事情分解成小步骤。我们将逐渐使用替换(substitution)来组合这些步骤:在函数中使用函数。
- 建议您在运行每个步骤后仔细检查结果。
- 注意,有关于 子字符串 和 连接 的单独教程。
***1. 声明新的字符串变量。
**
string n1 to n4 (a20).
***2. 提取名字的第一个字母。
**
compute n1 = char.substr(s1,1,1).
exe.
***3. 转换为大写。
**
compute n1 = upcase(n1).
exe.
***4. 替换:在 upcase 函数中使用 substring 函数。
**
compute n1 = upcase(char.substr(s1,1,1)).
exe.
***5. 提取剩余的字母并转换为小写。
**
compute n1 = lower(char.substr(s1,2)).
exe.
***6. 替换:连接先前尝试的结果。
**
compute n1 = concat(upcase(char.substr(s1,1,1)),lower(char.substr(s1,2))).
exe.
2. 纠正姓氏前缀
- 由于这些是荷兰名字,姓氏前缀应该完全是小写。
- 但是,我们将首先使用
LTRIM
函数删除任何前导空格。 - 接下来,我们将把双空格替换为单空格。有关更正更长空格序列的信息,请参见 SPSS LOOP 命令 的第二个语法示例。
***1. 删除前导空格。
**
compute n2 = ltrim(s2).
exe.
***2. 替换:删除前导空格并转换为小写。
**
compute n2 = lower(ltrim(s2)).
exe.
***3. 将双空格替换为单空格。
**
compute n2 = replace(n2,' ',' ').
exe.
3. 组合名字和姓氏
- 对于姓氏,与名字的规则相同:第一个字母大写,其余字母小写。
- 因此,我们可以重用我们为名字编写的表达式,只需进行一些小的修改。
- 现在,组合名字、中间名和姓氏需要比基本连接稍微多一些。这是因为 SPSS 会自动在字符串值的右侧填充空格,以匹配字符串变量的长度。
- 因此,连接 3 个长度为 20 的字符串将生成一个长度为 60 的字符串。如果变量宽度不足,则只会显示前几个字符。这就是下面示例中发生的情况(尽管它 看起来像 连接不起作用)。
- 在 Unicode 模式下,
RTRIM
会自动应用。但是,无论 SPSS 是否处于 Unicode 模式,都可以在语法中包含它,以确保一切正常工作。
***1. 重用用于名字的大小写语法,用于姓氏。
**
compute n3 = concat(upcase(char.substr(s3,1,1)),lower(char.substr(s3,2))).
exe.
***2. 如果省略 rtrim,则 concat 似乎不起作用。
**
compute n4 = concat(n1,n2,n3).
exe.
***3. 正确的连接,但应插入空格。
**
compute n4 = concat(rtrim(n1),rtrim(n2),rtrim(n3)).
exe.
***4. 最终连接。
**
compute n4 = concat(rtrim(n1),' ',rtrim(n2),' ',rtrim(n3)).
exe.
***5. 将双空格替换为单空格。
**
compute n4 = replace(n4,' ',' ').
exe.
4. 标记单字母姓名
- 不幸的是,并非所有受访者都填写了他们的真实姓名。许多此类情况无法从手头的数据中检测到,但很容易识别出一些可疑模式。
- 一种这样的模式是非常短(1 或 2 个字母)的名字或姓氏。由于我们在数据中分别提供了这些信息,我们可以使用
CHAR.LENGTH
来标记这些情况。 - 对于组合姓名,名字包含直到第一个空格的所有字母。我们可以使用
CHAR.INDEX
函数找到它。 - 相反,姓氏包含 最后一个 空格之后的所有字母,可以通过
CHAR.RINDEX
找到它。从姓名的长度中减去最后一个空格的位置会返回姓氏的长度。 - 例如,“Anneke van den Berg” 是 19 个字母。最后一个空格是第 15 个字母。现在 19 减去 15 返回 4 - 这确实是 “Berg” 的长度。
***1. 从单独的姓名组成部分中查找短名字/姓氏。
**
compute flag_1a = char.length(s1).
compute flag_1b = char.length(s3).
exe.
***2. 从组合姓名中查找短名字/姓氏。
**
compute flag_2a = char.index(n4,' ') -1.
compute flag_2b = char.length(n4) - char.rindex(rtrim(n4),' ').
exe.