分类变量在R语言中对应的数据类型是「因子」(factor)。但是,分类变量并不一定要以因子的形式储存,也可以先以数值、文本等类型存储,待到需要使用其「分类」属性时再转成因子形式。因此,似乎没有太大必要专门学习针对因子变量的处理方法。forcats
相比tidyverse
家族的dplyr
、tidyr
、purrr
等工具包使用频率也远远较低。
学堂君根据功能对forcats
中的「所有」函数作了汇总,共分为两大类、六小类:
❝❞
1 针对单个因子变量的处理函数
1.1 增删类别的函数
1.2 归并类别的函数
1.3 重命名类别的函数
1.4 调整类别顺序的函数
1.5 其他函数
2 针对多个因子变量的处理函数
本篇为1.11.3部分。
library(forcats)
1 针对单个因子变量的处理函数
1.1 增删类别的函数
fct_drop()
众所周知,因子变量中可以存在不对应任何样本的类别,学堂君曾利用这一特点写了一篇可视化技巧的推文,详见基础绘图系统的subset参数对分类变量的妙用。
fct_drop()
函数的功能是将这些空样本的类别删除掉。
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 bbb
fct_drop(f)
## [1] a aa b bb
## Levels: a aa b bb
如果想要保留个别空样本的类别,也即只删除部分空样本的类别,可以将要删除的类别名称赋值给only
参数。
fct_drop(f, only = "bbb")
## [1] a aa b bb
## Levels: a aa aaa b bb
只有当类别对应的样本为空时,赋值给only
参数才能将其删除;否则赋值无效。
## 没有效果
fct_drop(f, only = "a")
## [1] a aa b bb
## Levels: a aa aaa b bb bbb
fct_expand()
该函数的功能是增加因子变量的类别。
fct_expand(f, "c", "cc", "ccc")
## [1] a aa b bb
## Levels: a aa aaa b bb bbb c cc ccc
lvls_expand()
该函数是fct_expand()
的低级版本。使用时需将新增类别连同已存在的类别赋值给new_levels
参数。
lvls_expand(f, new_levels = c("a", "aa", "aaa", "b", "bb", "bbb",
"c", "cc", "ccc"))
## [1] a aa b bb
## Levels: a aa aaa b bb bbb c cc ccc
好处是在新增类别的同时,还可以顺便调整类别顺序:
lvls_expand(f, new_levels = c("a", "b", "c", "aa", "bb", "cc",
"aaa", "bbb", "ccc"))
## [1] a aa b bb
## Levels: a b c aa bb cc aaa bbb ccc
1.2 归并类别的函数
fct_collapse()
该函数的功能是将多个类别合并成一个类别(合并后的类别可以不使用原类别的名称),不需要归并的类别不用动。
fct_collapse(f, A = c("a", "aa", "aaa"))
## [1] A A b bb
## Levels: A b bb bbb
还可以将没有被归并的类别直接归成一类,类别名称使用other_level
指定。
fct_collapse(f, A = c("a", "aa", "aaa"),
other_level = "other")
## [1] A A other other
## Levels: A other
fct_other()
该函数的功能是将某些类别归并为「其他」类。
keep
参数指定哪些类不被归并为其他类:
fct_other(f, keep = c("a", "aa", "aaa"))
## [1] a aa Other Other
## Levels: a aa aaa Other
drop
参数指定哪些类被归并为其他类:
fct_other(f, drop = c("b", "bb", "bbb"))
## [1] a aa Other Other
## Levels: a aa aaa Other
fct_lump_*
该系列包含四个函数。它们的功能是使用「统计」的方式来决定将哪些类别被归为「其他」类。
set.seed(1234)
f2 <- factor(rpois(100, 5))
fct_count(f2, sort = T, prop = T)
## # A tibble: 9 x 3
## f n p
## <fct> <int> <dbl>
## 1 4 19 0.19
## 2 3 18 0.18
## 3 5 18 0.18
## 4 6 14 0.14
## 5 2 9 0.09
## 6 7 9 0.09
## 7 8 7 0.07
## 8 1 5 0.05
## 9 11 1 0.01
❝❞
fct_count()
函数的功能是统计每个类别对应的样本数量,下篇会介绍;
f
列表示类别,n
列表示样本个数,p
列表示样本占比。
样本个数少的归为其他类,用fct_lump_min()
:
fct_lump_min(f2, 10) %>% fct_count(sort = T, prop = T)
## # A tibble: 5 x 3
## f n p
## <fct> <int> <dbl>
## 1 Other 31 0.31
## 2 4 19 0.19
## 3 3 18 0.18
## 4 5 18 0.18
## 5 6 14 0.14
❝❞
“少于”不包含本数。
样本占比小的归为其他类,用fct_lump_prop()
:
fct_lump_prop(f2, 0.05) %>% fct_count(sort = T, prop = T)
## # A tibble: 8 x 3
## f n p
## <fct> <int> <dbl>
## 1 4 19 0.19
## 2 3 18 0.18
## 3 5 18 0.18
## 4 6 14 0.14
## 5 2 9 0.09
## 6 7 9 0.09
## 7 8 7 0.07
## 8 Other 6 0.06
除样本数在前几位(Top )的类别,其他类别都归为其他类,用fct_lump_n()
:
fct_lump_n(f2, 4) %>% fct_count(sort = T, prop = T)
## # A tibble: 5 x 3
## f n p
## <fct> <int> <dbl>
## 1 Other 31 0.31
## 2 4 19 0.19
## 3 3 18 0.18
## 4 5 18 0.18
## 5 6 14 0.14
fct_lump_lowfreq()
函数自动计算归并方案以确保在归并后,“其他”类的样本量少于未归并的类别;不需要设置参数:
fct_lump_lowfreq(f2) %>% fct_count(sort = T, prop = T)
## # A tibble: 8 x 3
## f n p
## <fct> <int> <dbl>
## 1 4 19 0.19
## 2 3 18 0.18
## 3 5 18 0.18
## 4 6 14 0.14
## 5 2 9 0.09
## 6 7 9 0.09
## 7 8 7 0.07
## 8 Other 6 0.06
1.3 重命名类别的函数
fct_recode()
该函数的功能是手动改变需要重命名的因子类别;不需要重命名的类别不用动。
fct_recode(f, A = "a", AA = "aa", AAA = "aaa")
## [1] A AA b bb
## Levels: A AA AAA b bb bbb
lvls_revalue()
该函数的功能是通过提供重命名后的所有类别名称来进行重命名(赋值给new_levels
参数);即使不需要重命名的类别也需要包括在内,并按类别顺序依次书写。
lvls_revalue(f, new_levels = c("A", "AA", "AAA",
"b", "bb", "bbb"))
## [1] A AA b bb
## Levels: A AA AAA b bb bbb
fct_anon()
使用数字对因子类别进行随机重命名(即匿名);每次运行结果都不一样。
fct_anon(f)
## [1] 4 1 6 5
## Levels: 1 2 3 4 5 6
fct_anon(f)
## [1] 4 1 6 5
## Levels: 1 2 3 4 5 6
fct_relabel()
使用一定的规则(.fun
参数)自动对因子类别进行重命名。.fun
参数支持匿名函数(详见purrr | 使用map族函数进行向量化运算第5部分)
fct_relabel(f, ~paste0("T", .x, "T"))
## [1] TaT TaaT TbT TbbT
## Levels: TaT TaaT TaaaT TbT TbbT TbbbT