Skip to content

12.7 RECODE ​

RECODE 命令用于把现有取值转换为其他由用户指定的取值。其一般形式为:

RECODE src_vars
        (src_value src_value … = dest_value)
        (src_value src_value … = dest_value)
        (src_value src_value … = dest_value) …
         [INTO dest_vars].

在 RECODE 关键字之后是 src_vars,即待转换取值的变量列表。这些变量可以是字符串变量,也可以是数值变量。但列表必须是同质的;不能在同一次重新编码中混用字符串变量和数值变量。

在源变量列表之后,应有一个或多个映射。每个映射用括号括起来,包含源取值和目标取值,两者之间用一个 ‘=’ 分隔。源取值用于指定数据集中需要更改的取值,目标取值指定应将其更改成的新取值。每个 src_value 可以是以下形式之一:

数字

如果源变量是数值型,则 src_value 可以是一个数字字面量。

字符串

如果源变量是字符串型,则 src_value 可以是一个字符串字面量(与所有字符串一样,用单引号或双引号括起来)。

num1 THRU num2

这种形式仅在源变量为数值型时有效。它指定 num1 到 num2 之间(含两端)的所有取值。按惯例,num1 应小于 num2。可以使用 ‘LO’ 或 ‘LOWEST’ 表示 num1、用 ‘HI’ 或 ‘HIGHEST’ 表示 num2 来指定开区间范围。

‘MISSING’

字面量关键字 ‘MISSING’ 同时匹配系统缺失值和用户缺失值。它对数值型和字符串型变量均有效。

‘SYSMIS’

字面量关键字 ‘SYSMIS’ 匹配系统缺失值。它仅对数值型变量有效。

‘ELSE’

‘ELSE’ 关键字可用于匹配命令中未被任何其他 src_value 匹配到的取值。如果使用该关键字,应将其放在命令的最后一个映射中。

源变量之后是一个 ‘=’,其后是 dest_value。dest_value 可以是以下形式之一:

数字

目标取值应更改成的数字字面量。这意味着目标变量必须是数值型。

字符串

目标取值应更改成的字符串字面量(用引号括起来)。这意味着目标变量必须是字符串型。

‘SYSMIS’

关键字 ‘SYSMIS’ 将取值更改为系统缺失值。这意味着目标变量必须是数值型。

‘COPY’

特殊关键字 ‘COPY’ 表示源取值不应被修改,而是直接复制到目标取值。仅当指定了 ‘INTO dest_vars’ 时才有意义。

映射按从左到右的顺序依次考虑。因此,如果一个取值被多个映射中的 src_value 匹配,则采用第一个(最左边)匹配的映射,后续的匹配将被忽略。

‘INTO dest_vars’ 子句是可选项。命令的行为会根据其是否出现而略有不同。

如果未出现 ‘INTO dest_vars’,则取值将“就地”重新编码。也就是说,重新编码后的取值会写回原始取值所在的源变量。在这种情况下,每个映射的 dest_value 都必须隐含一个与 src_value 类型相同的值。例如,如果源取值是字符串取值,则 dest_value 不能是 ‘SYSMIS’ 或其他隐含数值结果的形态。dest_value 也不能长于源变量的宽度。

下面的例子将两个数值变量 x 和 y 就地重新编码。0 重新编码为 99,1 到 10(含)的取值保持不变,1000 及以上的取值重新编码为系统缺失值,所有其他取值更改为 999:

recode x y
        (0 = 99)
        (1 THRU 10 = COPY)
        (1000 THRU HIGHEST = SYSMIS)
        (ELSE = 999).

如果给定了 ‘INTO dest_vars’,则重新编码后的取值会写入 dest_vars 中指定的变量,因此其中必须包含一个有效的变量名列表。dest_vars 中的变量个数必须与 src_vars 中的变量个数相同,且 dest_vars 中变量的顺序与 src_vars 相对应。也就是说,原始取值来自 src_vars 中第 n 个变量的重新编码取值,会被放入 dest_vars 中第 n 个变量。源变量保持不变。如果某个映射隐含字符串作为目标取值,则相应的目标变量必须已经存在,或已使用 STRING 或其他转换命令声明过。而数值变量若不存在则会自动创建。下面的例子处理两个源变量 a 和 b,它们包含字符串取值。因此有两个目标变量 v1 和 v2。凡是 a 或 b 取值为 ‘apple’、‘pear’ 或 ‘pomegranate’ 的个案,会使 v1 或 v2 填入字符串 ‘fruit’;而取值为 ‘tomato’、‘lettuce’ 或 ‘carrot’ 的个案则填入 ‘vegetable’。其他所有取值产生结果 ‘unknown’:

string v1 (a20).
string v2 (a20).

recode a b
        ("apple" "pear" "pomegranate" = "fruit")
        ("tomato" "lettuce" "carrot" = "vegetable")
        (ELSE = "unknown")
        into v1 v2.

还有一个上面未提及的特殊映射。如果源变量是字符串变量,则可以将映射指定为 ‘(CONVERT)’。该映射(若出现)必须是给出的最后一个映射,且必须同时给出 ‘INTO dest_vars’ 子句,并且该子句不能引用字符串变量。‘CONVERT’ 会把以字符串形式给出的数字转换为数值。例如,它将字符串 ‘"3"’ 转换为数值 3(注意它不会把 ‘three’ 转换为 3)。如果字符串无法解析为数字,则改为赋系统缺失值。在下面的例子中,x(字符串变量)取值为空字符串的个案,重新编码为 999,其余个案转换为输入值对应的数值。结果放入数值变量 y:

recode x
       ("" = 999)
        (convert)
        into y.

可以在单条命令中指定多次重新编码。使用斜杠 (‘/’) 引出额外的重新编码,以与之前的重新编码分隔:

recode
        a  (2 = 22) (else = 99)
        /b (1 = 3) into z
        .

这里我们有两次重新编码。第一次作用于源变量 a,将取值 2 就地重新编码为 22,其余所有取值重新编码为 99。第二次重新编码把 b 的取值复制到变量 z,同时将其中所有 1 改为 3。

基于 GNU PSPP 2.0.1 手册与入门教程整理