4.3 变量的重编码

重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。举例来说,你可能想:

  • 将一个连续型变量修改为一组类别值;

  • 将误编码的值替换为正确值;

  • 基于一组分数线创建一个表示及格/不及格的变量。

要重编码数据,可以使用R中的一个或多个逻辑运算符(见表4-3)。逻辑运算符表达式可返回TRUEFALSE表4-3 逻辑运算符

运 算 符 描  述
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 严格等于*
!= 不等于
!x x
x | y xy
x & y Xy
isTRUE(x) 测试x是否为TRUE

* 类似于其他科学计算语言,在R中比较浮点型数值时请慎用==,以防出现误判。详情参考“R FAQ”7.31节。——译者注

不妨假设你希望将leadership数据集中经理人的连续型年龄变量age重编码为类别型变量agecatYoungMiddle AgedElder)。首先,必须将99岁的年龄值重编码为缺失值,使用的代码为:

  1. leadership$age[leadership$age == 99] <- NA

语句variable[condition] <- expression将仅在condition的值为TRUE时执行赋值。

在指定好年龄中的缺失值后,你可以接着使用以下代码创建agecat变量:

  1. leadership$agecat[leadership$age > 75] <- "Elder"
  2. leadership$agecat[leadership$age >= 55 &
  3. leadership$age <= 75] <- "Middle Aged"
  4. leadership$agecat[leadership$age < 55] <- "Young"

你在leadership$agecat中写上了数据框的名称,以确保新变量能够保存到数据框中。你将中年人(Middle Aged)定义为55到75岁,这样不会让我感觉自己是个老古董。请注意,如果你一开始没把99重编码为age的缺失值,那么经理人5就将在变量agecat中被错误地赋值为“老年人”(Elder)。

这段代码可以写成更紧凑的:

  1. leadership <- within(leadership,{
  2. agecat <- NA
  3. agecat[age > 75] <- "Elder"
  4. agecat[age >= 55 & age <= 75] <- "Middle Aged"
  5. agecat[age < 55] <- "Young" })

函数within()与函数with()类似(见2.2.4节),不同的是它允许你修改数据框。首先,我们创建了agecat变量,并将每一行都设为缺失值。括号中剩下的语句接下来依次执行。请记住agecat现在只是一个字符型变量,你可能更希望像2.2.5节讲解的那样把它转换成一个有序型因子。

若干程序包都提供了实用的变量重编码函数,特别地,car包中的recode()函数可以十分简便地重编码数值型、字符型向量或因子。而doBy包提供了另外一个很受欢迎的函数recodevar()。最后,R中也自带了cut(),可将一个数值型变量按值域切割为多个区间,并返回一个因子。