R语言入门笔记5-数据整理dplyr包

根据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()

你可能感兴趣的:(R语言入门笔记5-数据整理dplyr包)