4.3 变量的重编码
重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。举例来说,你可能想:
将一个连续型变量修改为一组类别值;
将误编码的值替换为正确值;
基于一组分数线创建一个表示及格/不及格的变量。
要重编码数据,可以使用R中的一个或多个逻辑运算符(见表4-3)。逻辑运算符表达式可返回TRUE
或FALSE
。
表4-3 逻辑运算符
运 算 符 | 描 述 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 严格等于* |
!= | 不等于 |
!x | 非x |
x | y | x 或y |
x & y | X 和y |
isTRUE(x) | 测试x 是否为TRUE |
* 类似于其他科学计算语言,在R中比较浮点型数值时请慎用==,以防出现误判。详情参考“R FAQ”7.31节。——译者注
不妨假设你希望将leadership
数据集中经理人的连续型年龄变量age
重编码为类别型变量agecat
(Young
、 Middle Aged
、Elder
)。首先,必须将99岁的年龄值重编码为缺失值,使用的代码为:
leadership$age[leadership$age == 99] <- NA
语句variable[condition] <- expression
将仅在condition
的值为TRUE
时执行赋值。
在指定好年龄中的缺失值后,你可以接着使用以下代码创建agecat
变量:
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 &
leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"
你在leadership$agecat
中写上了数据框的名称,以确保新变量能够保存到数据框中。你将中年人(Middle Aged
)定义为55到75岁,这样不会让我感觉自己是个老古董。请注意,如果你一开始没把99重编码为age
的缺失值,那么经理人5就将在变量agecat
中被错误地赋值为“老年人”(Elder
)。
这段代码可以写成更紧凑的:
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young" })
函数within()
与函数with()
类似(见2.2.4节),不同的是它允许你修改数据框。首先,我们创建了agecat
变量,并将每一行都设为缺失值。括号中剩下的语句接下来依次执行。请记住agecat
现在只是一个字符型变量,你可能更希望像2.2.5节讲解的那样把它转换成一个有序型因子。
若干程序包都提供了实用的变量重编码函数,特别地,car
包中的recode()
函数可以十分简便地重编码数值型、字符型向量或因子。而doBy
包提供了另外一个很受欢迎的函数recodevar()
。最后,R中也自带了cut()
,可将一个数值型变量按值域切割为多个区间,并返回一个因子。