forcats | tidyverse家族对「分类变量」的解决方案(上)

分类变量在R语言中对应的数据类型是「因子」(factor)。但是,分类变量并不一定要以因子的形式储存,也可以先以数值、文本等类型存储,待到需要使用其「分类」属性时再转成因子形式。因此,似乎没有太大必要专门学习针对因子变量的处理方法。forcats相比tidyverse家族的dplyrtidyrpurrr等工具包使用频率也远远较低。

学堂君根据功能对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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值