dplyr 是plyr的增强版,名称中的d表名了它是一个专注于处理数据框的R包,dplyr提供了灵活的数据操作语法。其特点如下:
- 识别最重要的数据操作动词,并使其易于使用。
- 通过在C ++中编写关键部分(使用Rcpp)为内存数据提供极快的性能
- 使用相同的界面处理数据,无论数据存储在何处(数据框、数据表或者数据库)
注:本文所用数据来自nycflights13::flights,该数据集包含2013年从纽约市出发的所有336776个航班信息。
用dplyr 包处理数据时,要先将数据转化成tbl_df 的tibble类型的数据(flights数据集不需要转换,这里仅作演示)
# 导入包
library(nycflights13)
# 检索数据集
dim(flights)
# 转换数据
flights <- tbl_df(flights)
筛选:
filter(数据集, 条件1 & 条件2 ...)
类似于SQL的where语句,条件选择操作。filter() 和slice()函数可以按给定的逻辑条件筛选出符合要求的子数据集, 类似于 base::subset() 函数,但代码更加简洁, 同时也支持对同一对象的任意个条件组合(表示AND时要使用&或者直接使用逗号),返回与.data相同类型的对象。原数据集行名称会被过滤掉。
# 查询所有1月1号的航班
filter(flights, month == 1 & day == 1)
# 等同于下面这条语句
flights[flights$month == 1 & flights$day == 1, ]
排列:
arrange(数据集, 变量1, 变量2, 变量3 ...)
arrange()按给定的列名依次对行进行排序,类似于base::order()函数。默认是按照升序排序,对列名加 desc() 可实现倒序排序。原数据集行名称会被过滤掉。
# 按照年、月、日升序排列
arrange(flights, year, month, day)
# 航班到达延误字段用desc()按降序排列
arrange(flights, desc(arr_delay))
查询:
select(数据集, 变量1, 变量2, 变量3 ...)
select()用列名作参数来选择子数据集。dplyr包中提供了些特殊功能的函数与select函数结合使用, 用于筛选变量,包括starts_with,ends_with,contains,matches,one_of,num_range和everything等。用于重命名时,select()只保留参数中给定的列,rename()保留所有的列,只对给定的列重新命名。原数据集行名称会被过滤掉。
# 查询年、月、日字段
select(flights, year, month, day)
# 等同于下面这条语句
select(flights, year:day)
# 查询除年、月、日字段以外的所有字段
select(flights, -(year:day))
添加:
mutate(数据集, 变量1 = 条件, 变量2 = 条件 ...)
mutate()和transmute()函数对已有列进行数据运算并添加为新列,类似于base::transform() 函数, 不同的是可以在同一语句中对刚增添加的列进行操作。mutate()返回的结果集会保留原有变量,transmute()只返回扩展的新变量。原数据集行名称会被过滤掉。
# 计算航班延迟时间和速度(不保留新变量)
mutate(flights,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60
)
# 不保留新变量,但引用新建的变量
mutate(flights,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60
)
# 计算航班延迟时间和延迟时间占比(保留新变量)
transmute(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
统计:
summarise(数据集, 条件)
对数据框调用函数进行汇总操作, 返回一维的结果。返回多维结果时会报如下错误:
Error: expecting result of length one, got : 2
原数据集行名称会被过滤掉。
# 计算航班平均延迟时间
summarise(flights,
delay = mean(dep_delay, na.rm = TRUE)
)
去重:
distinct(数据集, 去重对象)
distinct()用于对输入的tbl进行去重,返回无重复的行,类似于 base::unique() 函数,但是处理速度更快。原数据集行名称会被过滤掉。
# 对月份去重
distinct(flights, month)
抽样:
sample_n(数据集, 抽取数量 ...)
sample_frac(数据集, 抽取比例 ...)
sample_n()随机抽取指定数目的样本,sample_frac()随机抽取指定百分比的样本,默认都为不放回抽样,通过设置replacement = TRUE可改为放回抽样,可以用于实现Bootstrap抽样。
sample_n(tbl, size, replace = FALSE, weight = NULL, .env = NULL)
sample_frac(tbl, size = 1, replace = FALSE, weight = NULL, .env = NULL)
# 随机无重复的取10行数据
sample_n(flights, 10)
# 随机无重复的取10%的数据
sample_frac(flights, 0.1)
网友评论