![3b1ae6c51c90273b88bd5cc1417ba0e2.png](https://i-blog.csdnimg.cn/blog_migrate/5039f8d71035ac6af249918dc5576c73.jpeg)
![f5be54e7e914aad89f64e10bdb0d03e5.png](https://i-blog.csdnimg.cn/blog_migrate/3954df005692e7889f7497ba1fbeeffd.jpeg)
2.1.1 tidyverse 包简介
tidyverse 包是 Hadley Wickham 及团队的集大成之作,是专为数据科学而开发的一系列包的合集, 基于整洁数据,提供了一致的底层设计哲学、语法、数据结构 。
![8fa91c9cfe15b97f7fbaff33a535ffa1.png](https://i-blog.csdnimg.cn/blog_migrate/99b092aa2a9027251e9f77f83ee2f935.jpeg)
tidyverse 用 “ 现代 的 " 、 “ 优雅 的" 方式,以 管道式 、 泛函式 编程技术实现了数据科学的整个流程: 数据导入、数据清洗、数据操作、数据可视化、数据建模、可重现与交互报告 。
![198eeecd0b50a236eb049c44bd5d728f.png](https://i-blog.csdnimg.cn/blog_migrate/5e36dd0daee541cc180b7cdd305391ae.jpeg)
在 tidyverse 包的引领下,近年来涌现出一系列具体研究领域的 tidy* 版本的包,比较综合的有 tidymodels (机器学习)、 rstatix (统计)、 tidybayes (贝叶斯模型)、 tidyquant(金融)、 fpp3 (时间序列)、 tidytext (文本挖掘)、 sf (空间数据分析)、 tidybulk (生信)等。
tidyverse 与 data.table
tidyverse 操作数据语法优雅、容易上手,但效率与主打高效的 data.table 包不可同日而语,处理几 G 甚至几十 G 的数据,需要用 data.table.
但 data.table 的语法高度抽象、不容易上手。本书不对 data.table 做过多展开,其简单使用可参阅附录 2 。另一种不错的方案是使用专门的转化包:有不少包尝试底层用 data.table ,上层用 tidyverse 语法包装(转化),如 dtplyr, tidyfst 等。
2.1.2 管道操作
1. 什么是管道操作?
magrittr 包引入了管道操作,能够通过管道将数据从一个函数传给另一个函数,从而用若干函数构成的 管道 依次变换你的数据。
例如,对数据集 mtcars ,先按分类变量 cyl 分组,再对连续变量 mpg 做分组汇总:计算均值。
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
summarise(mpg_avg = mean(mpg))
![dde72015111ce3c3c8e2ba56d5ee22d8.png](https://i-blog.csdnimg.cn/blog_migrate/ea95db38dcaa4655367dfe4bd90994c9.png)
管道运算符 %>%
的意思是:将左边的运算结果,以输入的方式传给右边函数。若干个函数通过管道链接起来,叫做 管道( pipeline ) 。
x %>% f() %>% g() # 等同于 g(f(x))
对该管道示例应该这样理解:
依次对数据进行若干操作:先对x
进行f
操作 , 接着对结果进行g
操作 。
管道,也支持 R base 函数:
month.abb %>% # 内置月份名缩写字符向量
sample(6) %>%
tolower() %>%
str_c(collapse = "|")
![97694a5d59ff7ab093bcccd8fef0d45e.png](https://i-blog.csdnimg.cn/blog_migrate/e5fb60d25355644c0cda6c851d58dab1.png)
使用管道的好处是:
- 避免使用过多的中间变量;
- 程序可读性大大增强:
管道操作的过程,读起来就是对原数据集依次进行一系列操作的过程。而非管道操作,读起来与操作的过程是相反的,比如同样实现上例:
str_c(tolower(sample(month.abb, 6)), collapse="|")
2. 常用管道操作
(1)管道默认将数据传给下一个函数的第 1 个参数,且它可以省略
c(1, 3, 4, 5, NA) %>%
mean(., na.rm = TRUE) # "." 可以省略
c(1, 3, 4, 5, NA) %>%
mean(na.rm = TRUE) # 建议写法
这种机制使得管道代码看起来就是:从数据开始,依次用函数对数据施加一系列的操作(变换数据),各个函数都直接从非数据参数开始写即可,而不用再额外操心数据的事情,数据会自己沿管道向前 "流动 " 。
正是这种管道操作,使得 tidyverse 能够 优雅 地操作数据。
所以, tidyverse 中的函数都设计为数据作为第 1 个参数,自定义的函数也建议这样做。
(2)数据可以在下一个函数中使用多次
数据经过管道默认传递给函数的第 1 个参数(通常直接省略);若在非第 1 个参数处使用该数据,必须用 “.” 代替(绝对不能省略),这使得管道作用更加强大和灵活。
下面看一些具体实例:
# 数据传递给 plot 第一个参数作为绘图数据 (. 省略 ),
# 同时用于拼接成字符串给 main 参数用于图形标题
c(1, 3, 4, 5) %>%
plot(main = str_c(., collapse=","))
# 数据传递给第二个参数 data
mtcars %>%
plot(mpg ~ disp, data = .)
# 选择列
iris %>%
.$Species # 选择 Species 列内容
iris %>%
.[1:3] # 选择 1-3 列子集
再来看一个更复杂的例子:
mtcars %>%
split(.$cyl) %>% # . 相当于 mtcars
map(~ lm(mpg ~ wt, data = .x))
split()
是将数据框 mtcars
根据其 cyl
列(包含 3 个水平的分类变量)分组,得到包含 3 个成分的列表;列表接着传递给 map(.x, .f)
的第一个参数(直接省略),
~ lm(mpg ~ wt, data = .x)
是第二参数 .f
,为 purrr
风格公式写法。
整体来看,实现的是分组建模:将数据框根据分类变量分组,再用 map
循环机制依次对每组数据建立线性回归模型。
![5bdd00cd071db7a521b744782d7ad4c5.png](https://i-blog.csdnimg.cn/blog_migrate/2045630183d95f1c800dc6a6043af5fa.png)
主要参考文献
- Hadley Wickham,R for Data Science,2017.
- Desi Quintans, Jeff Powell. Working in the Tidyverse.http://www.hiercourse.com/
________________________________
版权声明:原创作品,版权所有,禁止用于一切出版。