R语言基础包对「分类变量」的解决方案
前面用三篇推文介绍了forcats工具包中处理分类变量的函数,本篇再来介绍一下基础包中的相关函数。
1 主要函数概况
与因子变量相关的主要函数如下:
factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)ordered(x, ...)is.factor(x)
is.ordered(x)as.factor(x)
as.ordered(x)addNA(x, ifany = FALSE) 这些函数最常用的是factor()和as.factor(),前者用于定义因子变量,后者用于将其他类型变量转换成因子变量,二者在许多情况下可以混用。
is.factor()用来判断变量是否为因子类型。
ordered()函数和factor()函数一样,都是用来定义因子变量的,区别在于前者定义的只能是有序因子变量,而后者通常情况下定义的是无序因子变量,但通过设置参数ordered = TRUE也可以定义有序因子变量。
通过下面例子可以比较二者所定义变量的区别(体现在Levels上):
f = factor(c("a", "aa", "b", "bb"),levels = c("a", "aa", "aaa", "b", "bb", "bbb"))
f
## [1] a aa b bb
## Levels: a aa aaa b bb bbbf2 = ordered(c("a", "aa", "b", "bb"),levels = c("a", "aa", "aaa", "b", "bb", "bbb"))
f2
## [1] a aa b bb
## Levels: a < aa < aaa < b < bb < bbb
有序因子变量的
Levels包含小于号,用来表示类别之间的等级关系;无序因子变量的类别顺序不表示等级关系。
as.ordered()和is.ordered()函数同理。
addNA()函数用来将因子变量中的缺失值单独归为一类。
2 因子操作
与forcats包相比,基础包中处理分类变量的函数并不多,那么它都能实现哪些操作呢?下面学堂君就来一一进行介绍。
2.1 删去空样本类别
第一种方式是使用操作符[]:
f[, drop = TRUE]
## [1] a aa b bb
## Levels: a aa b bb 第二种方式是对因子变量再使用一次factor()函数,如果是有序因子变量则使用ordered()函数(下文同理):
factor(f)
## [1] a aa b bb
## Levels: a aa b bbordered(f2)
## [1] a aa b bb
## Levels: a < aa < b < bb 第三种方法是使用droplevels()函数:
droplevels(f)
## [1] a aa b bb
## Levels: a aa b bb 2.2 提取因子类别
使用levels()函数提取因子变量的全部类别(包含空样本类别):
levels(f)
## [1] "a" "aa" "aaa" "b" "bb" "bbb" 使用unique()函数提取包含样本的全部类别(不包含空样本类别):
unique(f)
## [1] a aa b bb
## Levels: a aa aaa b bb bbb 2.3 归并因子类别
可以使用factor()的labels参数实现这一操作:
factor(f, levels = levels(f),labels = c("A", "A", "A", "B", "B", "B"))
## [1] A A B B
## Levels: A B
这里因为
f本身就是因子变量,再次使用factor()函数会删去其中的空样本类别,因此需要设置参数levels = levels(f)。
2.4 删除因子类别
使用factor()函数的exclude参数:
factor(f, levels = levels(f),exclude = "a")
## [1] aa b bb
## Levels: aa aaa b bb bbb 2.5 新增因子类别
可以通过levels()函数重新设置类别来实现:
levels(f) <- c(levels(f), "c")
f
## [1] a aa b bb
## Levels: a aa aaa b bb bbb c 2.6 调整因子类别顺序
这类操作也可以通过重新设置类别来实现。另外relevel()函数可以将任意类别调整至第一个类别:
relevel(f, ref = "c")
## [1] a aa b bb
## Levels: c a aa aaa b bb bbb relevel()函数不能对有序因子变量使用:
relevel(f2)
# Error in relevel.ordered(f2) : 'relevel' only for unordered factors 2.7 将缺失值作为一个类别
使用addNA()函数:
f3 <- factor(c(1,2,3, NA))
f3
## [1] 1 2 3
## Levels: 1 2 3addNA(f3)
## [1] 1 2 3
## Levels: 1 2 3 2.7 合并多个因子变量
如果每个因子变量都是一个独立的变量,可以直接使用c()函数进行合并:
c(f, f3)
## [1] a aa b bb 1 2 3
## Levels: a aa aaa b bb bbb c 1 2 3 如果多个因子变量位于同一个列表变量中,可以使用unlist()函数:
f4 <- mtcars[1:10,c("cyl", "vs", "am")]
f4 <- lapply(f4, FUN = factor)
f4
## $cyl
## [1] 6 6 4 6 8 6 8 4 4 6
## Levels: 4 6 8
##
## $vs
## [1] 0 0 1 1 0 1 0 1 1 1
## Levels: 0 1
##
## $am
## [1] 1 1 1 0 0 0 0 0 0 0
## Levels: 0 1unlist(f4)
## cyl1 cyl2 cyl3 cyl4 cyl5 cyl6 cyl7 cyl8 cyl9 cyl10 vs1 vs2 vs3
## 6 6 4 6 8 6 8 4 4 6 0 0 1
## vs4 vs5 vs6 vs7 vs8 vs9 vs10 am1 am2 am3 am4 am5 am6
## 1 0 1 0 1 1 1 1 1 1 0 0 0
## am7 am8 am9 am10
## 0 0 0 0
## Levels: 4 6 8 0 1 3 模型中的因子变量
模型对两种类型的因子变量的处理方式是完全不同的。
对于无序因子变量来说,模型会将第一个类别作为参照组,而其他类别分别当作一个0-1变量(二分类变量):
data = mtcars[, c("mpg", "gear")] summary(lm(mpg ~ factor(gear), data = data))
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 16.107 1.216 13.250 7.87e-14 ***
## factor(gear)4 8.427 1.823 4.621 7.26e-05 ***
## factor(gear)5 5.273 2.431 2.169 0.0384 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 如果要更换参照组,则使用relevel()函数将对应的类别移至第一个类别即可:
summary(lm(mpg ~ relevel(factor(gear), ref = "4"), data = data))
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.533 1.359 18.051 < 2e-16 ***
## relevel(factor(gear), ref = "4")3 -8.427 1.823 -4.621 7.26e-05 ***
## relevel(factor(gear), ref = "4")5 -3.153 2.506 -1.258 0.218
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 对于有序因子变量来说,模型会把它当作连续变量一样使用它的多项式:
summary(lm(mpg ~ ordered(gear), data = data))
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20.6733 0.9284 22.267 < 2e-16 ***
## ordered(gear).L 3.7288 1.7191 2.169 0.03842 *
## ordered(gear).Q -4.7275 1.4888 -3.175 0.00353 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ordered(gear).L表示变量的一次项,ordered(gear).Q表示二次项,此外.C表示三次项,^4表示四次项,以此类推。
4 连续变量因子化
如果要将连续变量转换成因子变量,可以使用cut()函数。它的语法结构如下:
cut(x, breaks, labels = NULL,include.lowest = FALSE, right = TRUE, dig.lab = 3,ordered_result = FALSE, ...)
x:待转换的变量;
breaks:分割位置;除了要包含中间的分割位置外,还需要包括上、下限;上下限之外的值会被归为NA;
right:为TRUE时表示分割区间为左开右闭;为FALSE时表示左闭右开;
include.lowest:左开右闭时,是否包含分割点的最小值;左闭右开时,是否包括分割点的最大值;
ordered_result:输出的因子变量是否为有序型;默认为否。
a = min(data$mpg)
b = max(data$mpg)
a
## [1] 10.4
b
## [1] 33.9cut(data$mpg, breaks = c(a, 15, 20, 25, 30, b))
## [1] (20,25] (20,25] (20,25] (20,25] (15,20] (15,20] (10.4,15]
## [8] (20,25] (20,25] (15,20] (15,20] (15,20] (15,20] (15,20]
## [15] (10.4,15] (30,33.9] (30,33.9] (30,33.9] (20,25]
## [22] (15,20] (15,20] (10.4,15] (15,20] (25,30] (25,30] (30,33.9]
## [29] (15,20] (15,20] (10.4,15] (20,25]
## Levels: (10.4,15] (15,20] (20,25] (25,30] (30,33.9] 设置include.lowest = T:
cut(data$mpg, breaks = c(a, 15, 20, 25, 30, b),include.lowest = T)
## [1] (20,25] (20,25] (20,25] (20,25] (15,20] (15,20] [10.4,15]
## [8] (20,25] (20,25] (15,20] (15,20] (15,20] (15,20] (15,20]
## [15] [10.4,15] [10.4,15] [10.4,15] (30,33.9] (30,33.9] (30,33.9] (20,25]
## [22] (15,20] (15,20] [10.4,15] (15,20] (25,30] (25,30] (30,33.9]
## [29] (15,20] (15,20] [10.4,15] (20,25]
## Levels: [10.4,15] (15,20] (20,25] (25,30] (30,33.9] 设置right = F:
cut(data$mpg, breaks = c(a, 15, 20, 25, 30, b),include.lowest = T, right = F)
## [1] [20,25) [20,25) [20,25) [20,25) [15,20) [15,20) [10.4,15)
## [8] [20,25) [20,25) [15,20) [15,20) [15,20) [15,20) [15,20)
## [15] [10.4,15) [10.4,15) [10.4,15) [30,33.9] [30,33.9] [30,33.9] [20,25)
## [22] [15,20) [15,20) [10.4,15) [15,20) [25,30) [25,30) [30,33.9]
## [29] [15,20) [15,20) [15,20) [20,25)
## Levels: [10.4,15) [15,20) [20,25) [25,30) [30,33.9] 设置ordered_result = T:
cut(data$mpg, breaks = c(a, 15, 20, 25, 30, b),include.lowest = T, right = F,ordered_result = T)
## [1] [20,25) [20,25) [20,25) [20,25) [15,20) [15,20) [10.4,15)
## [8] [20,25) [20,25) [15,20) [15,20) [15,20) [15,20) [15,20)
## [15] [10.4,15) [10.4,15) [10.4,15) [30,33.9] [30,33.9] [30,33.9] [20,25)
## [22] [15,20) [15,20) [10.4,15) [15,20) [25,30) [25,30) [30,33.9]
## [29] [15,20) [15,20) [15,20) [20,25)
## Levels: [10.4,15) < [15,20) < [20,25) < [25,30) < [30,33.9] 推荐阅读
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
