文章目錄
  1. 1. dplyr简介
    1. 1.1. 安装包
    2. 1.2. dplyr主要功能
    3. 1.3. 数据集了解
    4. 1.4. 查看数据集
  2. 2. Filter rows with filter()
    1. 2.1. Use filter to select all flights on March 13st
    2. 2.2. filter 和普通筛选的区别
    3. 2.3. 使用组合条件筛选行
    4. 2.4. 练习
    5. 2.5. 使用行号筛选行
  3. 3. Arrange rows with arrange()
    1. 3.1. 按照年月日依次排序
    2. 3.2. arrange的等价命令
  4. 4. Select columns with select()
    1. 4.1. 选择年月日三列
    2. 4.2. 选择相邻列
    3. 4.3. 删除某些列
    4. 4.4. select的周边函数
    5. 4.5. 练习
    6. 4.6. 使用select更改列名
    7. 4.7. 使用rename更改列名
  5. 5. Extract distinct (unique) rows
    1. 5.1. distinct多列
  6. 6. Add new columns with mutate()
    1. 6.1. mutate和transform
    2. 6.2. 如果使用transform
  7. 7. Summarise values with summarise()
  8. 8. 随机选择行
    1. 8.1. sample_n()
    2. 8.2. sample_frac()
  9. 9. dplyr进阶
    1. 9.1. 以上命令的共同点
    2. 9.2. 联合使用
    3. 9.3. Grouped operations
  10. 10. 使用分组进行变量统计
    1. 10.1. 使用 group_by 进行统计
    2. 10.2. 使用 ggplot2 可视化
  11. 11. summarise和其他函数结合使用
    1. 11.1. 计算每个目的地接待的飞机数量和降落次数
    2. 11.2. 计算每个目的地接待的飞机数量和降落次数
    3. 11.3. 使用 group_by 进行多层级分组
    4. 11.4. 按月统计航班数量
    5. 11.5. 按年统计航班数量
  12. 12. 管道操作
    1. 12.1. dplyr 基本语法的弊病
    2. 12.2. 嵌套式写法
    3. 12.3. 管道操作: Pipe operator
    4. 12.4. 练习
  13. 13. 练习题答案
    1. 13.1. 2013年3月中旬, 延迟起飞的班次有多少?
    2. 13.2. 全年哪个月份的班次延迟到达的比例最高?
    3. 13.3. 列名选择问题答案
    4. 13.4. 求平均飞行时间最长的三条航线
    5. 13.5. 飞行距离1000以上及以下的航班平均延迟到达时间

dplyr简介

  • 作者: Hadley Wickham
  • 是plyr包的后续版本

安装包

1
2
install.packages("dplyr")
install.packages("nycflights13")
1
2
library(nycflights13)
library(dplyr)

dplyr主要功能

  • filter() (and slice())
  • arrange()
  • select() (and rename())
  • distinct()
  • mutate() (and transmute())
  • summarise()
  • sample_n() and sample_frac()

数据集了解

使用 nycflights13 包中的 flights 数据集. ?flights 查看数据集情况和变量意义

1
dim(flights)
1
## [1] 336776     16

查看数据集

1
head(flights)
1
2
3
4
5
6
7
8
9
10
11
12
## Source: local data frame [6 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 1 1 517 2 830 11 UA N14228
## 2 2013 1 1 533 4 850 20 UA N24211
## 3 2013 1 1 542 2 923 33 AA N619AA
## 4 2013 1 1 544 -1 1004 -18 B6 N804JB
## 5 2013 1 1 554 -6 812 -25 DL N668DN
## 6 2013 1 1 554 -4 740 12 UA N39463
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

Filter rows with filter()

filter() 用来筛选数据框中的行.

  • 第一个参数是数据框的名称
  • 后面的参数是筛选条件

问题: 如何筛选所有在3月13号出发的飞机?

Use filter to select all flights on March 13st

1
filter(flights, month == 3, day == 13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [974 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 3 13 103 68 457 77 B6 N640JB
## 2 2013 3 13 458 -2 648 0 US N107US
## 3 2013 3 13 515 0 805 -5 UA N76153
## 4 2013 3 13 525 -5 821 -6 UA N17233
## 5 2013 3 13 541 -4 920 -3 B6 N729JB
## 6 2013 3 13 545 5 850 0 AA N5EFAA
## 7 2013 3 13 550 -10 648 -45 UA N477UA
## 8 2013 3 13 553 -7 709 -36 AA N3HKAA
## 9 2013 3 13 553 -7 845 -25 AA N3JEAA
## 10 2013 3 13 553 -7 714 -9 B6 N239JB
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

filter 和普通筛选的区别

以下几个筛选等价

1
2
3
filter(flights, month == 3, day == 13)
flights[flights$month == 3 & flights$day == 13, ]
subset(flights, month == 3 & day == 13)

使用组合条件筛选行

  • filter() 与 subset() 类似
  • 对于并列条件, filter可以使用逗号分隔, subset需要使用 & 符号
  • 也可以使用”或”
1
filter(flights, month == 1 | month == 2)

练习

  1. 2013年3月中旬, 延迟起飞的班次有多少?
  2. 全年哪个月份的班次延迟到达的比例最高?(table函数)

使用行号筛选行

1
slice(flights, 1:5)
1
2
3
4
5
6
7
8
9
10
11
## Source: local data frame [5 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 1 1 517 2 830 11 UA N14228
## 2 2013 1 1 533 4 850 20 UA N24211
## 3 2013 1 1 542 2 923 33 AA N619AA
## 4 2013 1 1 544 -1 1004 -18 B6 N804JB
## 5 2013 1 1 554 -6 812 -25 DL N668DN
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

Arrange rows with arrange()

  • arrange() 函数用来对行排序
  • 第一个参数是数据框
  • 后面的参数是列名, 从前到后按照次序排序
  • 默认升序, 如果要降序则使用desc()

按照年月日依次排序

1
arrange(flights, month, desc(day), dep_delay)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [336,776 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 1 31 821 -13 1041 2 EV N13978
## 2 2013 1 31 1233 -12 1320 -30 AA N3JRAA
## 3 2013 1 31 1918 -12 2157 6 9E N8924B
## 4 2013 1 31 549 -11 641 -28 B6 N239JB
## 5 2013 1 31 955 -11 1107 -14 EV N836AS
## 6 2013 1 31 600 -10 911 1 AA N5DMAA
## 7 2013 1 31 1119 -10 1421 2 B6 N712JB
## 8 2013 1 31 1135 -10 1257 -24 FL N989AT
## 9 2013 1 31 1540 -10 1812 -14 9E N908XJ
## 10 2013 1 31 651 -9 839 -11 AA N4XBAA
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

arrange的等价命令

  • dplyr::arrange() 与 plyr::arrange() 相似.
  • 与order函数类似, 不过运用更简便.
  • 以下情况等价
1
2
3
4
arrange(flights, year, month, day)
flights[order(flights$year, flights$month, flights$day), ]
arrange(flights, desc(arr_delay))
flights[order(desc(flights$arr_delay)), ]

Select columns with select()

  • 目的: 大数据集的列太多, 并非全都用到
  • select函数用来选择列, 缩小数据量
  • 对行不能筛选

选择年月日三列

1
select(flights, year, month, day)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [336,776 x 3]
##
## year month day
## (int) (int) (int)
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## .. ... ... ...

选择相邻列

1
select(flights, day:dep_delay)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [336,776 x 3]
##
## day dep_time dep_delay
## (int) (int) (dbl)
## 1 1 517 2
## 2 1 533 4
## 3 1 542 2
## 4 1 544 -1
## 5 1 554 -6
## 6 1 554 -4
## 7 1 555 -5
## 8 1 557 -3
## 9 1 557 -3
## 10 1 558 -2
## .. ... ... ...

删除某些列

1
select(flights, -(year:day))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [336,776 x 13]
##
## dep_time dep_delay arr_time arr_delay carrier tailnum flight origin
## (int) (dbl) (int) (dbl) (chr) (chr) (int) (chr)
## 1 517 2 830 11 UA N14228 1545 EWR
## 2 533 4 850 20 UA N24211 1714 LGA
## 3 542 2 923 33 AA N619AA 1141 JFK
## 4 544 -1 1004 -18 B6 N804JB 725 JFK
## 5 554 -6 812 -25 DL N668DN 461 LGA
## 6 554 -4 740 12 UA N39463 1696 EWR
## 7 555 -5 913 19 B6 N516JB 507 EWR
## 8 557 -3 709 -14 EV N829AS 5708 LGA
## 9 557 -3 838 -8 B6 N593JB 79 JFK
## 10 558 -2 753 8 AA N3ALAA 301 LGA
## .. ... ... ... ... ... ... ... ...
## Variables not shown: dest (chr), air_time (dbl), distance (dbl), hour
## (dbl), minute (dbl)

select的周边函数

  • select函数的功能也包含在base::subset()中, 用subset可以实现, 但不直接
  • select函数中, 选择列的时候可以使用很多其他函数来辅助, 比如
    • starts_with()
    • ends_with()
    • matches()
    • contains()
  • See ?select for more details.

练习

  1. 选择所有列名以”time”为结尾的列
  2. 选择所有列名中包含”rr”的列
  3. 选择所有列名长度不超过5个字符的列

使用select更改列名

You can rename variables with select() by using named arguments:

1
select(flights, tail_num = tailnum)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [336,776 x 1]
##
## tail_num
## (chr)
## 1 N14228
## 2 N24211
## 3 N619AA
## 4 N804JB
## 5 N668DN
## 6 N39463
## 7 N516JB
## 8 N829AS
## 9 N593JB
## 10 N3ALAA
## .. ...

使用rename更改列名

使用select更改列名会只保存那些没更改的列, 因此一般不使用这个方法

1
rename(flights, tail_num = tailnum)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [336,776 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr)
## 1 2013 1 1 517 2 830 11 UA
## 2 2013 1 1 533 4 850 20 UA
## 3 2013 1 1 542 2 923 33 AA
## 4 2013 1 1 544 -1 1004 -18 B6
## 5 2013 1 1 554 -6 812 -25 DL
## 6 2013 1 1 554 -4 740 12 UA
## 7 2013 1 1 555 -5 913 19 B6
## 8 2013 1 1 557 -3 709 -14 EV
## 9 2013 1 1 557 -3 838 -8 B6
## 10 2013 1 1 558 -2 753 8 AA
## .. ... ... ... ... ... ... ... ...
## Variables not shown: tail_num (chr), flight (int), origin (chr), dest
## (chr), air_time (dbl), distance (dbl), hour (dbl), minute (dbl)

Extract distinct (unique) rows

联合使用select和distinct函数, 来选择某一列(某几列)的唯一值(类似unique)

1
distinct(select(flights, tailnum))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [4,044 x 1]
##
## tailnum
## (chr)
## 1 N14228
## 2 N24211
## 3 N619AA
## 4 N804JB
## 5 N668DN
## 6 N39463
## 7 N516JB
## 8 N829AS
## 9 N593JB
## 10 N3ALAA
## .. ...

distinct多列

1
distinct(select(flights, month, day))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [365 x 2]
##
## month day
## (int) (int)
## 1 1 1
## 2 1 2
## 3 1 3
## 4 1 4
## 5 1 5
## 6 1 6
## 7 1 7
## 8 1 8
## 9 1 9
## 10 1 10
## .. ... ...

Add new columns with mutate()

在数据框中生成新的列, 使用mutate()

1
2
3
mutate(flights,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [336,776 x 18]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 1 1 517 2 830 11 UA N14228
## 2 2013 1 1 533 4 850 20 UA N24211
## 3 2013 1 1 542 2 923 33 AA N619AA
## 4 2013 1 1 544 -1 1004 -18 B6 N804JB
## 5 2013 1 1 554 -6 812 -25 DL N668DN
## 6 2013 1 1 554 -4 740 12 UA N39463
## 7 2013 1 1 555 -5 913 19 B6 N516JB
## 8 2013 1 1 557 -3 709 -14 EV N829AS
## 9 2013 1 1 557 -3 838 -8 B6 N593JB
## 10 2013 1 1 558 -2 753 8 AA N3ALAA
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl), gain (dbl), speed (dbl)

mutate和transform

  • dplyr::mutate() 与 plyr::mutate() 和 base::transform() 类似.
  • mutate() 和 transform() 的主要区别是mutate能引用刚刚创建的列
1
2
3
4
mutate(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## Source: local data frame [336,776 x 18]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 1 1 517 2 830 11 UA N14228
## 2 2013 1 1 533 4 850 20 UA N24211
## 3 2013 1 1 542 2 923 33 AA N619AA
## 4 2013 1 1 544 -1 1004 -18 B6 N804JB
## 5 2013 1 1 554 -6 812 -25 DL N668DN
## 6 2013 1 1 554 -4 740 12 UA N39463
## 7 2013 1 1 555 -5 913 19 B6 N516JB
## 8 2013 1 1 557 -3 709 -14 EV N829AS
## 9 2013 1 1 557 -3 838 -8 B6 N593JB
## 10 2013 1 1 558 -2 753 8 AA N3ALAA
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl), gain (dbl),
## gain_per_hour (dbl)

如果使用transform

1
2
3
4
transform(flights,
gain = arr_delay - dep_delay,
gain_per_hour = gain / (air_time / 60)
)

会出现error

Summarise values with summarise()

  • 与plyr::summarise())功能相同
  • 将一个数据框退化为一行
1
2
summarise(flights,
delay = mean(dep_delay, na.rm = TRUE))
1
2
3
4
5
## Source: local data frame [1 x 1]
##
## delay
## (dbl)
## 1 12.63907

随机选择行

随机抽样

  • sample_n() 抽固定个数
  • sample_frac() 抽固定比例
  • 可以使用replace = TRUE参数
  • base::sample 不能应用于数据框

sample_n()

1
sample_n(flights, 5)
1
2
3
4
5
6
7
8
9
10
11
## Source: local data frame [5 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 3 25 NA NA NA NA EV N11565
## 2 2013 7 16 833 48 946 31 UA N14704
## 3 2013 12 5 1923 138 2120 131 US N197UW
## 4 2013 10 22 2001 0 2246 -2 B6 N523JB
## 5 2013 10 19 650 -10 804 -29 UA N848UA
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

sample_frac()

1
sample_frac(flights, 0.01)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [3,368 x 16]
##
## year month day dep_time dep_delay arr_time arr_delay carrier tailnum
## (int) (int) (int) (int) (dbl) (int) (dbl) (chr) (chr)
## 1 2013 11 15 821 -9 936 -8 9E N602LR
## 2 2013 9 17 1621 -6 1743 -11 EV N14905
## 3 2013 8 21 2144 -6 2245 -26 EV N22971
## 4 2013 3 23 923 3 1251 6 AA N4XVAA
## 5 2013 2 25 852 -8 1215 -1 UA N415UA
## 6 2013 8 11 758 -2 951 -28 9E N600LR
## 7 2013 10 1 1021 -9 1318 -22 VX N636VA
## 8 2013 8 20 2358 -1 322 -18 B6 N662JB
## 9 2013 10 21 1350 -10 1445 -22 US N954UW
## 10 2013 4 24 1606 -4 1754 -6 AA N4XDAA
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: flight (int), origin (chr), dest (chr), air_time
## (dbl), distance (dbl), hour (dbl), minute (dbl)

dplyr进阶

以上命令的共同点

以上介绍的dplyr中的语法和函数有以下共同点:

  • 第一个参数永远是数据框的名字
  • 接下来的参数是告诉R你想做什么事情, 无需$符号来引用, 语言直白
  • 结论是一个新的数据框

联合使用

以上操作联合使用, 可以进行比较复杂的数据框操作:

  • 对行排序: arrange
  • 选择一些行和列: filter, select
  • 给数据框新添一些变量: mutate
  • 对某些变量进行总结: summarise

对数据框进行按行分组以后, 再对某些变量总结会更好

Grouped operations

对数据框进行按行分组的方法: group_by(). 经过分组以后:

  • select 与无分组时一样
  • arrange 优先按照分组变量来排序, 然后才对参数中的变量排序
  • mutate 和 filter 与一些 window function 一起操作(min), 最强大
  • vignette(“window-functions”) 查看 window function
  • sample_n() 和 sample_frac() 分组后在每组内分别抽样
  • slice 也在组内抽取行
  • summarise 最好用

去除分组: ungroup()

使用分组进行变量统计

考虑以下问题的计算:

  • 每架飞机在2013年的飞行次数(飞机尾号变量tailnum)
  • 每架飞机在2013年的平均飞行距离(distance)
  • 每架飞机在2013年的平均延迟到达时间(arr_delay)

使用 group_by 进行统计

1
2
3
4
5
6
by_tailnum <- group_by(flights, tailnum)
delay <- summarise(by_tailnum,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE))
delay <- filter(delay, count > 20, dist < 2000)

使用 ggplot2 可视化

1
2
3
4
5
library(ggplot2)
ggplot(delay, aes(dist, delay)) +
geom_point(aes(size = count), alpha = 1/2) +
geom_smooth() +
scale_size_area()
1
## geom_smooth: method="auto" and size of largest group is >=1000, so using gam with formula: y ~ s(x, bs = "cs"). Use 'method = x' to change the smoothing method.

summarise和其他函数结合使用

与summarise结合的函数的特点: 参数为向量, 结果返回单个数:

  • min(), max(), mean(), sum(), sd(), median(), and IQR()

dplyr包提供的类似函数有:

  • n(): 本组中的观测数量(计数)
  • n_distinct(x): x中的 unique values 的数量
  • first(x), last(x) and nth(x, n) 类似 x[1], x[length(x)] 和 x[n]

计算每个目的地接待的飞机数量和降落次数

  • 目的地: dest
  • 飞机数量: tailnum
  • 降落次数: 使用n()

计算每个目的地接待的飞机数量和降落次数

1
2
3
4
5
destinations <- group_by(flights, dest)
summarise(destinations,
planes = n_distinct(tailnum),
flights = n()
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Source: local data frame [105 x 3]
##
## dest planes flights
## (chr) (int) (int)
## 1 ABQ 108 254
## 2 ACK 58 265
## 3 ALB 172 439
## 4 ANC 6 8
## 5 ATL 1180 17215
## 6 AUS 993 2439
## 7 AVL 159 275
## 8 BDL 186 443
## 9 BGR 46 375
## 10 BHM 45 297
## .. ... ... ...

使用 group_by 进行多层级分组

按天统计航班数量

1
2
daily <- group_by(flights, year, month, day)
(per_day <- summarise(daily, flights = n()))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## Source: local data frame [365 x 4]
## Groups: year, month [?]
##
## year month day flights
## (int) (int) (int) (int)
## 1 2013 1 1 842
## 2 2013 1 2 943
## 3 2013 1 3 914
## 4 2013 1 4 915
## 5 2013 1 5 720
## 6 2013 1 6 832
## 7 2013 1 7 933
## 8 2013 1 8 899
## 9 2013 1 9 902
## 10 2013 1 10 932
## .. ... ... ... ...

按月统计航班数量

1
(per_month <- summarise(per_day, flights = sum(flights)))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Source: local data frame [12 x 3]
## Groups: year [?]
##
## year month flights
## (int) (int) (int)
## 1 2013 1 27004
## 2 2013 2 24951
## 3 2013 3 28834
## 4 2013 4 28330
## 5 2013 5 28796
## 6 2013 6 28243
## 7 2013 7 29425
## 8 2013 8 29327
## 9 2013 9 27574
## 10 2013 10 28889
## 11 2013 11 27268
## 12 2013 12 28135

按年统计航班数量

1
(per_year  <- summarise(per_month, flights = sum(flights)))
1
2
3
4
5
## Source: local data frame [1 x 2]
##
## year flights
## (int) (int)
## 1 2013 336776

管道操作

dplyr 基本语法的弊病

如果要对数据做很多操作, 则代码只能一步产生一个新数据框.

1
2
3
4
5
6
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)

嵌套式写法

如果不想出现中间结果, 则需要使用嵌套写法

1
2
3
4
5
6
7
8
9
10
11
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
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## Source: local data frame [49 x 5]
## Groups: year, month [11]
##
## year month day arr dep
## (int) (int) (int) (dbl) (dbl)
## 1 2013 1 16 34.24736 24.61287
## 2 2013 1 31 32.60285 28.65836
## 3 2013 2 11 36.29009 39.07360
## 4 2013 2 27 31.25249 37.76327
## 5 2013 3 8 85.86216 83.53692
## 6 2013 3 18 41.29189 30.11796
## 7 2013 4 10 38.41231 33.02368
## 8 2013 4 12 36.04814 34.83843
## 9 2013 4 18 36.02848 34.91536
## 10 2013 4 19 47.91170 46.12783
## .. ... ... ... ... ...

管道操作: Pipe operator

  • 嵌套操作难以读懂(从内往外读)
  • dplyr提供了 %>% 操作符, x %>% f(y) 即 f(x, y)
1
2
3
4
5
6
7
8
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## Source: local data frame [49 x 5]
## Groups: year, month [11]
##
## year month day arr dep
## (int) (int) (int) (dbl) (dbl)
## 1 2013 1 16 34.24736 24.61287
## 2 2013 1 31 32.60285 28.65836
## 3 2013 2 11 36.29009 39.07360
## 4 2013 2 27 31.25249 37.76327
## 5 2013 3 8 85.86216 83.53692
## 6 2013 3 18 41.29189 30.11796
## 7 2013 4 10 38.41231 33.02368
## 8 2013 4 12 36.04814 34.83843
## 9 2013 4 18 36.02848 34.91536
## 10 2013 4 19 47.91170 46.12783
## .. ... ... ... ... ...

练习

  1. 求平均飞行时间最长的三条航线
  2. 2013年上半年, 飞行距离1000以上及以下的航班平均延误时间各为多少?

练习题答案

2013年3月中旬, 延迟起飞的班次有多少?

1
2
nrow(filter(flights, month == 3, 
day > 10, day < 21, dep_delay > 0))
1
## [1] 4073

全年哪个月份的班次延迟到达的比例最高?

1
2
3
4
month_flights <- table(flights$month)
month_delay <- table((filter(flights,
arr_delay > 0))$month)
which.max(month_delay / month_flights)
1
2
## 12 
## 12

列名选择问题答案

  1. 选择所有列名以”time”为结尾的列
  2. 选择所有列名中包含”rr”的列
  3. 选择所有列名长度不超过5个字符的列
1
2
3
select(flights, ends_with("time"))
select(flights, contains("rr"))
flights[,nchar(colnames(flights)) < 6]

求平均飞行时间最长的三条航线

1
2
3
4
5
6
7
flights %>%
group_by(origin, dest) %>%
select(air_time, origin, dest) %>%
summarise(air_mean = mean(air_time, na.rm = T)) %>%
ungroup() %>%
arrange(desc(air_mean)) %>%
slice(1:3)
1
2
3
4
5
6
7
## Source: local data frame [3 x 3]
##
## origin dest air_mean
## (chr) (chr) (dbl)
## 1 JFK HNL 623.0877
## 2 EWR HNL 612.0752
## 3 EWR ANC 413.1250

飞行距离1000以上及以下的航班平均延迟到达时间

2013年上半年, 飞行距离1000以上及以下的航班平均延迟到达时间各为多少?

1
2
3
4
5
6
flights %>%
filter(month < 7) %>%
mutate(above1000 = distance > 1000) %>%
select(above1000, arr_delay) %>%
group_by(above1000) %>%
summarise(mean(arr_delay, na.rm = T))
1
2
3
4
5
6
## Source: local data frame [2 x 2]
##
## above1000 mean(arr_delay, na.rm = T)
## (lgl) (dbl)
## 1 FALSE 10.944168
## 2 TRUE 4.618789
文章目錄
  1. 1. dplyr简介
    1. 1.1. 安装包
    2. 1.2. dplyr主要功能
    3. 1.3. 数据集了解
    4. 1.4. 查看数据集
  2. 2. Filter rows with filter()
    1. 2.1. Use filter to select all flights on March 13st
    2. 2.2. filter 和普通筛选的区别
    3. 2.3. 使用组合条件筛选行
    4. 2.4. 练习
    5. 2.5. 使用行号筛选行
  3. 3. Arrange rows with arrange()
    1. 3.1. 按照年月日依次排序
    2. 3.2. arrange的等价命令
  4. 4. Select columns with select()
    1. 4.1. 选择年月日三列
    2. 4.2. 选择相邻列
    3. 4.3. 删除某些列
    4. 4.4. select的周边函数
    5. 4.5. 练习
    6. 4.6. 使用select更改列名
    7. 4.7. 使用rename更改列名
  5. 5. Extract distinct (unique) rows
    1. 5.1. distinct多列
  6. 6. Add new columns with mutate()
    1. 6.1. mutate和transform
    2. 6.2. 如果使用transform
  7. 7. Summarise values with summarise()
  8. 8. 随机选择行
    1. 8.1. sample_n()
    2. 8.2. sample_frac()
  9. 9. dplyr进阶
    1. 9.1. 以上命令的共同点
    2. 9.2. 联合使用
    3. 9.3. Grouped operations
  10. 10. 使用分组进行变量统计
    1. 10.1. 使用 group_by 进行统计
    2. 10.2. 使用 ggplot2 可视化
  11. 11. summarise和其他函数结合使用
    1. 11.1. 计算每个目的地接待的飞机数量和降落次数
    2. 11.2. 计算每个目的地接待的飞机数量和降落次数
    3. 11.3. 使用 group_by 进行多层级分组
    4. 11.4. 按月统计航班数量
    5. 11.5. 按年统计航班数量
  12. 12. 管道操作
    1. 12.1. dplyr 基本语法的弊病
    2. 12.2. 嵌套式写法
    3. 12.3. 管道操作: Pipe operator
    4. 12.4. 练习
  13. 13. 练习题答案
    1. 13.1. 2013年3月中旬, 延迟起飞的班次有多少?
    2. 13.2. 全年哪个月份的班次延迟到达的比例最高?
    3. 13.3. 列名选择问题答案
    4. 13.4. 求平均飞行时间最长的三条航线
    5. 13.5. 飞行距离1000以上及以下的航班平均延迟到达时间