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]
推荐阅读

be60b74bd585c5b3eadfdd9a6e0717e4.png
ggplot2基础语法系列推文汇总
f380a64585ba6046d8191297c95956df.png
胶水函数用法的几个例子
aee612b85f7506840d6e539c76c74ef6.png
空间计量经济模型的简单形式在R语言中的实现
2121f3cc4d915d942c95879ff8dd2c79.png
使用R语言的常用工具包绘制双变量填充地图
df05c020851b8ae24d771def34c16059.png
R语言基础绘图系统的拼图功能

d9360ef0878feaef5e9b19738a8dcfaf.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部