分类变量在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 bbbfct_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 6fct_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

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

  1. 把大脑「复制-粘贴」到芯片上,三星、哈佛的大胆设想登上Nature子刊

    视学算法报道 编辑:张倩.蛋酱 三星 & 哈佛:我们有一个大胆的想法-- 人的大脑有很多令人惊叹的优点,比如功耗低(相当于一个 20 瓦的灯泡).学习快(人类幼崽看几张图就可以学会一个概念). ...

  2. 为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案

    老师的手轻轻在智能屏幕上一触,空白位置就自动"冒"出了知识点:错过的课程和难点,本地和身处几百公里之外的学生同时能在系统中轻松查阅.互相交流讨论,再次还原和巩固:智能批改和网上批阅 ...

  3. 「造轮子」一个文件上传靶场知识总结记录

    https://www.sqlsec.com/2020/10/upload.html#toc-heading-1 或者 https://xz.aliyun.com/t/8435 直接使用别人的靶场总感 ...

  4. 科学探索奖名单揭晓:北大数学「黄金一代」袁新意上榜,首现90后获奖人

    Pine 发自 凹非寺 量子位 | 公众号 QbitAI 刚刚,第四届"科学探索奖"名单揭晓了! 共有来自基础科学和前沿技术10个领域的50位青年科学家入选,他们将在5年获得300 ...

  5. 「开发者说」自动化设备管理上钉钉,“源创食堂“小程序开发实践

    本篇文章的供稿人为柳州源创电喷技术有限公司装备开发部部长蒙东辉,概览本文大概需要3分钟,精读本文需要10分钟. "钉钉应用开发让公司食堂都实现了数字化转型,食堂备餐浪费与不足的现象得到了有效 ...

  6. 一个开源小项目,如何使用「分类网络」实现排球追踪

          01       背景概述 笔者最近接触到了一个很有趣的问题,有关于排球位置追踪.如果有看过排球比赛的话,大家想必都知道,排球的实时运动轨迹对排球的落点有很大的帮助.而如果可以预知排球的落 ...

  7. 「开发者说」车辆管理上钉钉,云上管车小程序开发分享

    本篇文章的供稿人为云上管车研发工程师刘奇云,内容主要为钉钉小程序开发相关,概览本文大概需要3分钟,精读本文需要10分钟 "随着经济社会数字化发展水平的提升,协同办公日趋常态化.云上管车通过与 ...

  8. 马云创办的「中国黄页」上线 | 历史上的今天

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2023 年 5 月 9 日,在 1993 年的今天,第一届东亚运动会在上海隆重开幕,这是亚洲体育运动史上的新篇章 ...

  9. 【干货】统计学最常用的「数据分析方法」清单(上)

    1 描述统计 描述统计是通过图表或数学方法,对数据资料进行整理.分析,并对数据的分布状态.数字特征和随机变量之间关系进行估计和描述的方法.描述统计分为集中趋势分析和离中趋势分析和相关分析三大部分. 1 ...

最新文章

  1. url rewrite优化url的可读性
  2. HttpServletRequest.getContextPath()取得的路径
  3. error while loading shared libraries: libstdc++.so.6: cannot open shared object file
  4. java 数据流对比_Java IO流之字符流字节流区别
  5. gerber文件_Altium Designer 如何输出PCB gerber文件
  6. PhpStrom 配置Xdebug
  7. 目标检测(Object Detection)的整理
  8. OpenGL超级宝典(第7版)笔记1 清单的初始环境配置part1
  9. 15个最流行的GitHub机器学习项目
  10. 重磅 I IT4IT 2.1中文版正式发布特邀专家彭斐推荐
  11. 【igraph实例】Commmunity 识别
  12. 爬取腾讯视频评论——以《三生三世,十里桃花》为例
  13. SpringBoot如何防止重复提交--use
  14. matlab棋盘格标定角点,相机标定(Camera calibration)Matlab——棋盘格标定原理,流程...
  15. typescript关键词Parameters和ReturnType
  16. 用supabase实时数据库替换mapus协作地图里的firebase
  17. CDN服务器是什么意思?CDN服务器搭建部署
  18. linux uniq去重不生效
  19. win10系统怎么设置自动登录?
  20. springboot优雅关机

热门文章

  1. 【华为OJ】【字符串分割】
  2. Excel时间递增或递减
  3. Android Qcom Camera V4L2 Device
  4. python中怎么绘制柱状簇_matplotlib中的簇状条形图?
  5. Cryp.1.大整数相乘---分治法
  6. 【linux docker】ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: 报错处理
  7. 【张泽华】android视频教程下载地址及上课源代码
  8. QtQuick资源文件问题
  9. c语言解析sql语句_C语言中嵌入式SQL语句
  10. HTML和HTML5,css和css3的区别,ES5和ES6的区别有那些?