前言
接下来的部分,我们主要介绍 R
的一个用于数据科学的集成包 tidyverse
,并用它所包含的各种 R
包来进行数据处理。
tidyverse
中所有的包具有同样的设计理念、语法以及数据结构
- 主要包含如下
R
包:
包名 | 描述 |
---|---|
ggplot2 | 鼎鼎大名的画图包,不用过多介绍 |
dplyr | 提供了一组便利的数据操作语法 |
tidyr | 数据的整洁之道 |
readr | 提供便利的方式读取矩阵数据(如 csv, tsv 和 fwf 等) |
purrr | 增强 R 的函数编程,避免 for 循环 |
tibble | 对 data.frame 的升级封装 |
stringr | 处理字符串,前面已经介绍过 |
forcats | 对 factor 替代 |
- 还有一些读取其他数据文件的包,如
-
DBI
: 关系数据库 -
haven
:SPSS
,Stata
, 和SAS
数据. -
httr
: 网络API
-
readxl
:.xls
和.xlsx
文件 -
rvest
: 网络爬虫. -
jsonlite
:JSON
数据 -
xml2
:XML
文件
- 处理时间数据的
-
lubridate
: 时间和日期 -
hms
: 持续时间或时间值,并以hh:mm:ss
格式显示它们。 -
blob
: 二进制数据
- 提高编程效率
-
magrittr
: 提供了一系列的管道操作符,接下来我们要详细介绍 -
glue
:paste
的替代,更容易的数据和字符串的组合
magrittr
介绍
magrittr
包定义了一组高效的管道操作工具包,通过管道的连接方式,让数据或表达式的传递更高效
- 从左到右构造数据操作序列(而不是从内到外)
- 避免函数嵌套
- 最小化对局部变量和函数定义的需求
- 使在操作序列中的任意位置添加步骤变得容易
安装导入
- 安装
直接安装 tidyverse
,会将该包下的所有包都装上,就不用一个个安装了
# The easiest way to get magrittr is to install the whole tidyverse:
install.packages("tidyverse")
如果你不想全部安装,只想要 magrittr
一个包,或其中几个包
# Alternatively, install just magrittr:
install.packages("magrittr")
安装开发版
# Or the development version from GitHub:
# install.packages("devtools")
devtools::install_github("tidyverse/magrittr")
- 导入
全部导入
library(tidyverse)
导入一个包
library(magrittr)
使用
magrittr
主要包括 4
个管道操作符:
-
%>%
: 向右操作符 -
%T>%
:Tee
操作符,向左操作符 -
%$%
: 解释操作符 -
%<>%
: 复合赋值管道操作符
1. %>%
将左边的结果传递给右边的函数作为第一个参数值,其结果可以继续向右边传递
- 基本管道操作
x %>% f => f(x)
x %>% f(y) => f(x, y)
x %>% f %>% g %>% h => h(g(f(x)))
默认将 %>%
左边的 x 作为右边的(如 f 函数)的第一个参数
示例
> x <- 3
> f <- function(x, y=1) { return(x+y) }
> x %>% f
[1] 4
> x %>% f(2)
[1] 5
- 参数占位符
x %>% f(y, .) => f(y, x)
x %>% f(y, z = .) => f(y, z = x)
使用 .
占位符,表示管道左边传过来的变量
> x %>% f(y = .,x = 5)
[1] 8
> x %>% f(y = 3,x = .)
[1] 6
- 对属性重用占位符
在右侧表达式中可以多次使用占位符。但是,当占位符仅出现在嵌套表达式中时,magrittr
仍将应用第一个参数规则。因为在大多数情况下,这会产生更干净的代码
x %>% f(y = nrow(.), z = ncol(.)) => f(x, y = nrow(x), z = ncol(x))
可以通过将右侧表达式用大括号包裹来取消这一规则
x %>% {f(y = nrow(.), z = ncol(.))} => f(y = nrow(x), z = ncol(x))
示例:
> x <- matrix(1:12, nrow = 3, ncol = 4)
> f<- function(x, y, z) { return(x * y * z) }
> x %>% f(y = nrow(.), z = ncol(.))
[,1] [,2] [,3] [,4]
[1,] 12 48 84 120
[2,] 24 60 96 132
[3,] 36 72 108 144
> x %>% {f(y = nrow(.), z = ncol(.))}
Error in f(y = nrow(.), z = ncol(.)) : 缺少参数"x",也没有缺省值
> x %>% {f(1, y = nrow(.), z = ncol(.))}
[1] 12
- 绑定函数
任何以 .
开头的管道序列将会返回一个一元函数
f <- . %>% cos %>% sin
# is equivalent to
f <- function(.) sin(cos(.))
- 传递到代码块
> rnorm(10) %>% multiply_by(5) %>% add(5) %>%
+ {
+ print("Mean:", mean(.))
+ sort(.) %>% head(5)
+ }
[1] "Mean:"
[1] -0.7076385 -0.3230133 0.9298034 0.9390084 2.5007525
- 传递到函数
> rnorm(10) %>% add(1) %>% `*`(10) %>%(
+ function(x) {
+ if (x[1] > 5) {
+ x-5
+ } else x
+ }
+ )
[1] -5.056051 5.214681 16.122495 22.311603 22.431362 15.828250 1.785964 -2.969273 26.003416
[10] 12.304749
2. %T>%
与 %>%
的区别是其结果不能向右传递,而是将 %T>%
左边的结果继续向右传递下去,%T>%
通常用来输出图形、打印结果到屏幕或者输出到文件,然后继续后面的 %>%
操作
而其左边的值相当于做了两次传递,分别传递给 %T>%
右侧表达式以及其后面的 %>%
管道符的右侧表达式。
也可以理解为在一串管道序列中插入了一个操作,但并不会影响其后续的管道序列
示例:
> a <- 5
> a %>% cos %T>% print %>% sin
[1] 0.2836622
[1] 0.2798734
> x %>% cos %T>% hist %>% sin
[,1] [,2] [,3] [,4]
[1,] 0.5143953 -0.6080830 0.6844888 -0.744023079
[2,] -0.4042392 0.2798734 -0.1449872 0.004425684
[3,] -0.8360219 0.8192892 -0.7901969 0.747209958
3. %$%
通常左边是数据框,%$%
右边的函数可直接使用该数据框中的变量
示例:
> x <- matrix(1:12, nrow = 3, ncol = 4)
> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(x > 5),]
[1] x y z
<0 行> (或0-长度的row.names)
> data.frame(x=x[,1], y=x[,2], z=x[,3]) %$% .[which(y > 5),]
x y z
3 3 6 9
相当于
> df <- data.frame(x=x[,1], y=x[,2], z=x[,3])
> df[which(df$y>5),]
x y z
3 3 6 9
4. %<>%
只能出现在所有管道符的第一个,用于在一长串处理管道操作之后直接将值赋值到最左边的对象上
示例:
> a <- 1:10
> print(a)
[1] 1 2 3 4 5 6 7 8 9 10
> a %<>% exp %>% sqrt
> print(a)
[1] 1.648721 2.718282 4.481689 7.389056 12.182494 20.085537 33.115452 54.598150 90.017131
[10] 148.413159
可以看出,a
的值变为 sqrt(exp(a))
通用函数操作符
除了上面 4 个主要的管道符之外,还重新定义了一些函数操作符,如下
函数 | 操作符 | |
---|---|---|
extract | [ |
|
extract2 | [[ |
|
inset | [<- |
|
inset2 | [[<- |
|
use_series | $ |
|
add | + |
|
subtract | - |
|
multiply_by | * |
|
raise_to_power | ^ |
|
multiply_by_matrix | %*% |
|
divide_by | / |
|
divide_by_int | %/% |
|
mod | %% |
|
is_in | %in% |
|
and | & |
|
or | ` | ` |
equals | == |
|
is_greater_than | > |
|
is_weakly_greater_than | >= |
|
is_less_than | < |
|
is_weakly_less_than | <= |
|
not | ! |
|
set_colnames | colnames<- |
|
set_rownames | rownames<- |
|
set_names | names<- |
示例
> seq(10) %>% `*`(5) %>% `+`(5)
[1] 10 15 20 25 30 35 40 45 50 55
> seq(10) %>% multiply_by(5) %>% add(5)
[1] 10 15 20 25 30 35 40 45 50 55