根据dplyr包的帮助文档,来学习dplyr包
示例数据集:nycflights13包中的flights
函数:
filter()
:根据变量对数据进行过滤筛选
arrange()
:对数据进行排序
select()
:根据变量选择数据子集
mutate()
:增加新变量
summarise()
:汇总数据
sample_n()
和sample_frac()
:从数据集中随机抽样
一、数据的准备
1、安装并加载nycflights13包,了解flights数据
install.packages("nycflights13")
library(nycflights13)
dim(flights)
head(flights)
? flights
可以看到flights是一个336776行,19列的tibble数据.不理解数据里的变量名可以使用?flights
查看其帮助文档
各个变量的含义如下:
year,month,day
: 航班出发日期
ep_time, arr_time
: 航班实际出发和到达的时间(格式:HHMM或者HMM),当地时间。
sched_dep_time,sched_arr_time
: 航班预定的本该出发和到达的时间。
dep_delay,arr_delay
: 出发和到达延误时间
hour,minute
:预定出发时间分解为小时,和分钟的数据
carrier
:航空公司名称缩写
tailnum
:机尾编号
flight
:航班号
origin,dest
:出发和到达城市
air_time
:飞行时间,以分钟为单位
distance
: 两个机场之间的距离,以英里为单位
time_hour
: 出发日期和出发时间的小时
二、使用dplyr函数对数据进行整理
1、使用filter()
对行进行筛选
install.packages("dplyr")
library(dplyr)
filter(flights, month == 1, day == 1)
## 基础函数可以使用如下方式达到同样效果:
flights[flights$month ==1 & flights$day == 1,]
2、使用arrange()
对行进行排序
arrange(flights, year, month, day)
# 配合使用desc()进行倒序排列:
arrange(flights, desc(year),desc(month),desc(day))
3、使用select()
选取列
select(flights, year, month, day)
select(flights, year:day)
select(flights,carrier:tailnum)
select(flights,10:12)
flights[,10:12]
# 配合starts_with(), ends_with(), matches(),contains()
select(flights, starts_with("dep"))
select(flights, ends_with("delay"))
select(flights, matches("arr"))
select(flights, contains("time"))
# 也可以使用select()对列进行重命名
select(flights, airlines = carrier)
# 因为select()去掉了所以其他没有提到的列,所以更好用的重命名还是rename()
rename(flights, airlines = carrier)
4、使用mutate()
增加新的列
mutate(flights,
gain = arr_delay - dep_delay,
speed = distance / air_time*60
)
# mutate()和基础函数transform()很相似,但是mutate()运行引用刚刚创建的新列:
mutate(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
# 如果只想保留新变量,使用transmute()
transmute(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
5、使用summarise()
进行数据汇总
summarise(flights,
delay = mean(dep_delay, na.rm = TRUE)
)
# summarise()配合group_by()时会非常有用,后面进行讲解
6、使用sample_n()
和sample_frac()
进行随机抽样
sample_n(flights, 10) # 随机抽取10行数据
sample_frac(flights, 0.01) # 随机抽取1%的数据
7、使用group_by()
进行分组
by_tailnum <- group_by(flights, tailnum)
by_tailnum
delay <- summarise(by_tailnum,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE))
delay
# n(), n_distinct(x), first(x), last(x), nth(x,n)
destinations <- group_by(flights, dest)
summarise(destinations,
planes = n_distinct(tailnum),
flights = n())
# 对分组数据进行向上逐步汇总:
daily <- group_by(flights, year, month,day)
per_day <- summarise(daily, flights = n())
per_day
per_month <- summarise(per_day, flights = sum(flights))
per_month
per_year <- summarise(per_month, flights = sum(flights))
per_year
8、使用管道符 %>%
简化代码书写
目标:筛选出航班出发和到达延误时间的平均值都超过30分钟的日期
方法一:每一步都要保存一个变量,缺点是每一步保存变量,下一步引用,麻烦!
a1 <- group_by(flights, year, month, day)
a2 <- select(a1, arr_delay, dep_delay)
a3 <- summarise(a2,
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE))
a4 <- filter(a3, arr > 30 | dep > 30)
a4
方法二:从内向外嵌套函数,缺点是参数离函数很远,不利于阅读。
filter(
summarise(
select(
group_by(flights, year, month, day),
arr_delay, dep_delay
),
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE)
),
arr > 30| dep > 30)
方法三:使用管道符,优点是直接将上一步的结果作为下一步函数的输入使用,规避了以上两种方法的缺点。
flights %>%
group_by(year, month, day) %>%
select(arr_delay, dep_delay) %>%
summarise(
arr = mean(arr_delay, na.rm = TRUE),
dep = mean(dep_delay, na.rm = TRUE)
) %>%
filter(arr > 30 | dep > 30)
三、总结
学了dplyr这个包的基本函数,我可以对数据做什么了呢?
操作 | 函数 |
---|---|
排序 | arrange() |
筛选 | filter()、select() |
增加列 | mutate() |
分组 | group_by() |
汇总 | summarise() |
抽样 | sample_n()、sample_frac() |