forcats

2023-11-18

引子

最近在整理forcats工具包中的函数,发现该包只有fct_reorder2()函数的功能不太容易理解,所以单独写一篇推文来介绍它。

根据上篇提到的函数分类,它可以归为「调整类别顺序的函数」,与它类似的还有一个fct_reorder()函数,但是功能要好理解得多。

作者对这两个函数的介绍可能会让很多读者觉得一头雾水:

  • 「学堂君译文」:根据其他变量对因子类别重排序。当因子变量映射到位置时,fct_reorder()函数在一维展示中非常有用;而当因子变量映射的是非位置属性时,fct_reorder2()函数可用于二维展示;

  • 「作者原文」:Reorder factor levels by sorting along another variable. fct_reorder() is useful for 1d displays where the factor is mapped to position; fct_reorder2() for 2d displays where the factor is mapped to a non-position aesthetic.

这段话之所以不太容易理解,是因为你以为它只是一个数据处理函数,但其实它主要用处却在可视化方面。英语原文中也出现了ggplot2绘图系统的术语——map和aesthetic。

fct_reorder()函数

两个函数的语法结构如下:

fct_reorder(.f, .x, .fun = median, ..., .desc = FALSE)
fct_reorder2(.f, .x, .y, .fun = last2, ..., .desc = TRUE)

简而言之,fct_reorder()就是根据另外「一个」变量(即参数.x)的统计特征(由参数.fun指定,默认为中位数)对因子变量(即参数.f)进行重排序,默认为升序(即.desc = FALSE)。

示例数据:

library(forcats)
f <- mtcars[, c("gear", "mpg", "qsec")]
f$gear <- factor(f$gear)
head(f)
##                   gear  mpg  qsec
## Mazda RX4            4 21.0 16.46
## Mazda RX4 Wag        4 21.0 17.02
## Datsun 710           4 22.8 18.61
## Hornet 4 Drive       3 21.4 19.44
## Hornet Sportabout    3 18.7 17.02
## Valiant              3 18.1 20.22

f$gear
##  [1] 4 4 4 3 3 3 3 4 4 4 4 3 3 3 3 3 3 4 4 4 3 3 3 3 3 4 5 5 5 5 5 4
## Levels: 3 4 5

根据mpg的平均值对gear的类别进行升序排列:

aggregate(mpg ~ gear, data = f, FUN = mean)
##   gear      mpg
## 1    3 16.10667
## 2    4 24.53333
## 3    5 21.38000

fct_reorder(f$gear, f$mpg, .fun = mean, .desc = F)
##  [1] 4 4 4 3 3 3 3 4 4 4 4 3 3 3 3 3 3 4 4 4 3 3 3 3 3 4 5 5 5 5 5 4
## Levels: 3 5 4
  • 可以看出,mpg在三个组别的平均值大小与调整后的因子类别顺序是一致的。

fct_reorder2()函数

这个函数的参数从表面上看与fct_reorder()函数有两个明显的区别:

  • 多了一个.y参数;

  • .desc参数的默认值不同。

其实,还有一个差别在同名参数.fun上:fct_reorder()函数要求.fun对应的函数只需要一个向量参数;而fct_reorder2()函数则要求有两个向量参数,其中第一个参数由.x映射,第二个参数由.y映射,即fun(.x, .y)

因此,最常见的用于描述统计特征的mean()函数就不能用在fct_reorder2()的参数赋值上。

fct_reorder2(f$gear, f$mpg, f$qsec, .fun = mean)
# Error in mean.default(.x[i], .y[i], ...) : 'trim'必需是长度必需为一的数值

作者专门为该函数的.fun参数设计了两个辅助函数:

  • last2():取.y在根据.x排序后的最后一个元素;然后以这个数值作为因子类别排序的依据;

  • first2():取.y在根据.x排序后的第一个元素;同样以这个数值作为因子类别排序的依据。

## last2为默认选项
fct_reorder2(f$gear, f$mpg, f$qsec)
##  [1] 4 4 4 3 3 3 3 4 4 4 4 3 3 3 3 3 3 4 4 4 3 3 3 3 3 4 5 5 5 5 5 4
## Levels: 3 4 5

## .fun = first2
fct_reorder2(f$gear, f$mpg, f$qsec, .fun = first2)
##  [1] 4 4 4 3 3 3 3 4 4 4 4 3 3 3 3 3 3 4 4 4 3 3 3 3 3 4 5 5 5 5 5 4
## Levels: 4 3 5

在可视化中的应用

作者为fct_reorder2()函数举了如下一个示例用法。

set.seed(123)
chks <- subset(ChickWeight, as.integer(Chick) < 10)
chks <- transform(chks, Chick = fct_shuffle(Chick))

library(ggplot2)
ggplot(chks, aes(Time, weight, colour = Chick)) +
  geom_point() +
  geom_line()

# Note that lines match order in legend
ggplot(chks, aes(Time, weight, colour = fct_reorder2(Chick, Time, weight))) +
  geom_point() +
  geom_line() +
  labs(colour = "Chick")

85bdd1d5cba510cdeefd4e395a294508.png

16ec79574a4e0117690a12a75bb5f223.png

<<< 左右滑动见更多 >>>

从语句上看,第二幅图代码中ggplot()函数的colour参数使用了fct_reorder2()函数进行重排序,.x.y参数分别对应于横、纵坐标轴的变量。从可视化效果上看,第二幅图的图例线条顺序与图中线条的高低顺序是一一对应的。

原因就在于,取纵坐标按横坐标排序后的最后一个元素,实际就是每个线条最右侧的纵坐标,这也是视觉上每个线条的“高度”,以此再对分组变量colour进行排序,图例的线条顺序自然就与图中线条高低顺序一致了。

同样地,fct_reorder()函数也可以用于可视化。

boxplot(Sepal.Width ~ Species, data = iris)
boxplot(Sepal.Width ~ fct_reorder(Species, Sepal.Width), data = iris)

0e5be91a7f3987b8250ac655d5dcfe5a.png

ff3ae08b5a8b94d8005d737cd6fee986.png

<<< 左右滑动见更多 >>>

上面两幅图的区别非常直观。第二幅图的代码根据Sepal.Width的中位数对Species的类别进行了排序,因此图中三个箱形图的中央横线是依次升高的。

再回过头来看开头的函数描述,fct_reorder()函数中的因子变量Species就是图象的横轴变量,也就是位置变量(mapped to position);而fct_reorder2()函数中的因子变量colour是除位置变量以外的美学特征变量(mapped to a non-position aesthetic)。

推荐阅读

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

3209bc966a4160abb2a185601c05bb6e.png
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

forcats 的相关文章

  • Django:导入错误:无法导入名称接收者

    非常基本的 django 应用程序 当我尝试执行任何操作 runserver syncdb 时 它会为我提供以下内容 想法 如果我的其中一个文件有问题 您能帮我指导一下问题可能是什么吗 File Library Python 2 7 sit
  • 如何在 Python 中使这个随机文本生成器更加高效?

    我正在研究一个随机文本生成器 不使用马尔可夫链 目前它的工作没有太多问题 首先 这是我的代码流程 输入一个句子作为输入 这称为触发字符串 被分配给一个变量 获取触发字符串中最长的单词 在所有古腾堡计划数据库中搜索包含该单词的句子 无论大写还
  • 为什么 Python zipfile 不提供与命令行 zip 相同的输出 .zip 文件大小?

    这是生成的文件的大小zip seq 10000 gt 1 txt zip 1 1 txt adding 1 txt deflated 54 ls og 1 zip rw r r 1 22762 Aug 29 10 04 1 zip 这是一个
  • 使用 pycharm 进行交互式 shell 调试

    我是 PyCharm 新手 我已经使用 IDLE 很长时间了 在IDLE中执行脚本后使用Python对象非常方便 有没有办法在使用 PyCharm 与交互式 python shell 执行后使用脚本对象 例如 我们有一个 测试 项目 其中包
  • 如何在基于其他数据帧的数据帧中创建联接?

    我有 2 个数据框 一份包含学生批次详细信息 另一份包含分数 我想加入 2 个数据框 数据框1包含 s1 s2 s3 Stud1 Stud2 Stud3 Stud2 Stud4 Stud1 Stud1 Stud3 Stud4 数据框2包含
  • 有没有纯Python的表类?

    我正在构建一个需要分析表格数据的应用程序 我想执行一些列操作 例如重命名列 删除列以及根据现有列的值计算新列的能力 我的第一选择是 Pandas 之类的东西 但是一个限制是这个项目必须是跨平台的并且非常容易在 virtualenv 中部署
  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 为不带引号的函数获取字符串参数

    我有一个函数 用于从 URL 下载文件并将其写入磁盘 并施加特定的文件扩展名 目前 它看起来像这样 import requests import os def getpml url filename psc requests get url
  • 使用 python 将 bibtex 文件转换为 html (也许是 pybtex?)

    您好 我想解析 bibtex 出版物文件并对特定字段 例如年份 进行排序并过滤某些内容 然后将其放在网站上 我遇到了 pybtex 它可以读取和解析 bibtex 文件 但它基本上没有记录 我不知道如何对条目进行排序 pybtex 是可行的
  • python:如何检查一行是否为空行

    试图弄清楚如何编写一个 if 循环来检查一行是否为空 该文件有许多字符串 其中之一是一个空行 用于与其他语句分隔开 不是 我认为是一个回车符后面跟着另一个回车符 new statement asdasdasd asdasdasdasd ne
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • 使用 Numpy 与 einsum 和 tensordot 进行相同的操作

    假设我有两个 3D 数组A and B形状的 3 4 N and 4 3 N 我可以计算沿第三轴的切片之间的点积 with einsum np eisum ikl kjl gt ijl A B 是否可以执行相同的操作numpy tensor
  • 是否可以使用 csv.DictReader 保持列顺序?

    例如 我的 csv 有如下列 ID ID2 Date Job No Code 我需要以相同的顺序写回各列 这dict立即打乱了顺序 所以我相信这更多是读者的问题 蟒蛇的dicts 在 3 6 之前不维持顺序 但是 无论如何 在该版本中csv
  • Python:像石英一样的事件调度程序[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Dataframe unstack 性能 - pandas

    我正在尝试拆开数据框 它工作正常 但问题是我正在处理 CSV 文件中的巨大数据集 约 10 亿 这是示例数据集 236539 48512569874 Name Danny 236539 48512569874 Class 12 236539
  • 与 GridSearchCV 的并行错误,与其他方法一起工作正常

    我使用 GridSearchCV 时遇到以下问题 它在使用时给我一个并行错误n jobs gt 1 同时n jobs gt 1与 RadonmForestClassifier 等单一模型配合良好 下面是一个显示错误的简单工作示例 train
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 使用 matplotlib 在 python3 中对多个形状进行动画处理

    尝试在 python3 中使用 matplotlib 动画函数同时对多个对象进行动画处理 下面写的代码是我到目前为止的位置 我能够创建多个对象并将它们显示在图中 我通过使用包含矩形补丁函数的 for 循环来完成此操作 从这里开始 我希望通过
  • Chrome 已关闭,并出现错误 ERROR:network_change_notifier_win.cc(141)] WSALookupServiceBegin 失败,原因为:0

    我的笔记本电脑操作系统是 windows 10 我使用 selenium webdriver 和 Python 当我通过脚本打开chrome浏览器时 加载网页后chrome就关闭了 下面是我的python代码和错误 from seleniu
  • 如何从 Django 中的链接设置预定义的表单值?

    我的项目是这样布局的 1 page has many categories 2 category belongs to page has many items 3 item belongs to category 当我进入一个页面时 我想修

随机推荐

  • 使用 iView Upload 组件实现手动上传文件

  • 【工具】使用npx一行命令就能压缩js文件

    有的时候要想压缩单个js文件 如果用webpack和gulp可能要配置一些东西 而用npx就可以帮我们一行命令就简单压缩js文件 1 只压缩js文件 npx uglify js main js o main min js 压缩后的新文件如下
  • Unity Hub 无法登陆解决办法

    问题描述 今天突然突然发现unityhub无法登录 输入账号密码后网页白屏 解决办法 找到unity程序的重装程序 打开unityhub属性 跟unityhub一个目录 名字为 Uninstall Unity H ub 运行 安装好后再试一
  • 电脑电池,笔记本电脑

    给大家纠正完了在比较电池容量方面的错误观念 下面我们来罗列几种在使用笔记本过程中可能会严重伤害到电池的坏习惯 看看你是否有中招 错误使用笔记本电脑电池习惯举例 1 不安装电池使用笔记本电脑 现在的主流笔记本厚度逐渐变小 电池也采用了内置不可
  • 孔乙己:跟我学做菜……不,多线程吧!

    孔乙己一到店 所有上机的人便都看着他笑 有的叫道 孔乙己 你的github上又添star了 他不回答 对柜里说 开个机子 再来个9块9套餐 便排出九行大钱 现钱 他们又故意高声的嚷道 你一定又翻墙了吧 孔乙己睁大眼睛说 你怎么这样凭空污人家
  • Fiddler 教程

    Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一 它能记录所有客户端和服务器的http和https请求 允许你监视 设置断点 甚至修改输入输出数据 使用Fiddler无论对开发还是测试来说 都有很大的帮助 阅读目录 F
  • CiteSpace关键词共现图谱含义详细解析与注意事项

    本文以CiteSpace软件做的关键词共现分析为例 进行关键词共现图谱含义详细解析 作者 机构 国家 学科 COOC软件可做 等网络分析与此类似 关键词是一篇论文的核心概括 对论文关键词进行分析可对文章主题窥探一二 而一篇论文给出的几个关键
  • 【golang】15、cobra cli 命令行库

    Cobra 是 golang 最流行的命令行库 文档见 一 脚手架 mkdir pt cd pt go mod init cobra cli init 在项目下运行即可生成脚手架 tree LICENSE cmd 生成了cmd目录 root
  • 求平均数的几种方法

    平均数 给定两个数a和b 求其平均值 分析 数学运算中一贯的算法是 a b 2 但在c语言中这种算法存在着一定的缺陷 当a和b足够大时 a和b的和就会存在溢出 从而得不到我们想要的结果 c语言中有相应的操作符可达到求平均数的效果 例如 gt
  • 刷脸支付推动产业智慧升级是大势所趋

    近日 浙江省绍兴市上虞区将 刷脸支付 功能向基层延伸 率先实现全区安全范围内的全覆盖 刷脸就医在全国范围内不断实现 在这个充满诱惑的时代 代理刷脸支付这个蓝海项目是许多想做刷脸支付的创业者急需的内容 刷脸支付 这项技术自面世以来就充斥着各种
  • 解决redis-server.exe不是内部或外部命令

    报错 redis server exe不是内部或外部命令 原因 未进入到redis的安装目录下 解决 先找到redis安装路径 复制之后 在终端中输入cd xxxxx redis的安装路径 进入安装目录之后再次输入redis server
  • 深入学习jquery源码之data()

    深入学习jquery源码之data jQuery data element key value 概述 在元素上存放数据 返回jQuery对象 注意 这是一个底层方法 你应当使用 data 来代替 此方法在jQuery 1 8中删除 但你仍然
  • Java面向对象编程

    将N条长度均为M的有序链表进行合并 合并以后的链表也保持有序 时间复杂度为 A O N M logN B O N M C O N D O M 答案 A 下设栈S的初始状态为空 元素a b c d e f依次入栈S 出栈的序列为b d c f
  • 百度网盘登陆验证提示:无法访问此页面,或者二维码显示失败,弹窗显示:无法访问此页面,确保web地址。。。。

    百度网盘登陆验证提示 无法访问此页面 或者二维码显示失败 弹窗显示 无法访问此页面 确保web地址 遇到百度网盘登陆时显示下面的情况 原因 是自己电脑的IE浏览器设置出了问题 没有显示出来应有的验证界面 解决方案 打开电脑的IE浏览器 在右
  • Apex安装失败(笔记记录分享)

    Apex安装失败 笔记记录 1 错误合集 No 1 error detected in the compilation of csrc multi tensor scale kernel cu No 2 module torch nn ha
  • Java long Long

    转载 https www cnblogs com c2g5201314 p 13024261 html 1 long 是 基本类型 Long 是 对象类型 2 long 默认值是 0 Long 默认值是 null 3 比较方法 1 Long
  • LVS 就是这么简单(数字后端物理验证篇)

    LVS 就是这么简单 数字后端物理验证篇 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 今天吾爱 IC 社区小编为大家带来数字 IC 后端实现物理验证中关于 LVS 的主题分享 其实小编一直觉得这
  • 调整echarts中图与legend的距离

    1 正常调整legend的位置 通过X改变横坐标位置 通过Y改变纵轴位置 x 可设定图例在左 右 居中 y 可设定图例在上 下 居中 legend y bottom data 阳性转阴性 阴性转阳性 阳性无症状转有症状 未检测 2 如果觉得
  • STM32F103ZET6【标准库函数开发】------04 串口USART1控制LED

    一 硬件介绍 STM32F103ZET6有5个串口 查看引脚图可以找到对应的IO口分别如下 串口 USART1 USART2 USART3 UART4 UART5 输入 输出方式 USARTx TX PA9 PA2 PB10 PC10 PC
  • forcats

    引子 最近在整理forcats工具包中的函数 发现该包只有fct reorder2 函数的功能不太容易理解 所以单独写一篇推文来介绍它 根据上篇提到的函数分类 它可以归为 调整类别顺序的函数 与它类似的还有一个fct reorder 函数