每天 5 分钟,轻轻松松上手 R 语言(三)

每天 5 分钟,轻轻松松上手 R 语言(三)

今天我们开始学习 R 数据科学中关于 dplyr 的章节,dplyr 是 tidyverse 的核心包,本节我们将使用 nycflights13 包中的数据来阐述 dplyr 的核心用法。

加载包:

1
2
library(tidyverse)
library(nycflights13)

?flights 查看 flights 数据集的说明,这个数据框包含了 2013 年从纽约市出发的所有336776次航班的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
flights
#> A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time
#> <int> <int> <int> <int> <int> <dbl> <int>
#>1 2013 1 1 517 515 2 830
#>2 2013 1 1 533 529 4 850
#>3 2013 1 1 542 540 2 923
#>4 2013 1 1 544 545 -1 1004
#>5 2013 1 1 554 600 -6 812
#>6 2013 1 1 554 558 -4 740
#>7 2013 1 1 555 600 -5 913
#>8 2013 1 1 557 600 -3 709
#>9 2013 1 1 557 600 -3 838
#10 2013 1 1 558 600 -2 753
#> … with 336,766 more rows, and 12 more variables:
#> sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
#> flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
#> time_hour <dttm>

我们可以看到该数据集是 tibble 类型的,tibble 是一种更适合 tidyvers 使用的数据框。

各变量的含义:

变量名 含义
year、month、day 起飞年月日
arr_time 到达时间
dep_time 起飞时间
sched_dep_time 计划起飞时间
sched_arr_time 计划到达时间
arr_delay 到达延误
dep_delay 起飞延误
hour 计划起飞 hour
minute 计划起飞 minute
carrier 承运商缩写
tailnum 飞机尾号
origin 始发地
dest 目的地
airtime 空中时间
distance 机场间距
flight 航班号
time_hour 计划起飞的天和具体时间
  • int 表示整数型变量
  • dbl 表示双精度浮点数型变量,或称实数
  • chr 表示字符向量,或称字符串
  • dttm 表示日期时间(日期+时间)型变量

另外还有以下三种常用的数据类型:

  • lgl 表示逻辑型变量,是一个仅包括 TRUE 和 FALSE 的向量
  • fctr 表示因子,R 用其来表示具有固定数目的值的分类变量
  • date 表示日期型变量

掌握了以上几种常见的数据类型,我们就可以开始 dplyr 的畅快之旅了

dplyr 的主要操作可以概括为以下几种:

  • 按值筛选观测(filter())
  • 对行进行重新排序(arrange())
  • 按名称选取变量(select())
  • 使用现有变量的函数创建新变量(mutate())
  • 将多个值总结为一个摘要统计量(summarize())

首先我们来看行筛选函数 filter()

R 中的运算符跟其他编程语言的类似,分为比较运算符和逻辑运算符

比较运算符:>、>=、<、<=、!=(不等于)和==(等于)
布尔运算符:& 表示“与”、| 表示“或”、! 表示“非”

接下来我们将利用 filter 函数和这些运算符对数据行进行筛选

1
2
filter(flights, month == 1, day == 1) # 1月1日起飞的航班
filter(flights, month == 11 | month == 12) # 11月或12月起飞的航班

进行下面的环节之前,我们看一看 R 中的缺失值运算,为什么要提缺失值运算呢?因为 filter() 只筛选条件为 TRUE 的行,
当数据中有缺失值而我们又没做处理,会得不到预期的结果,比如下面这个例子

1
2
3
4
5
6
df <- tibble(x = c(1, NA, 3)) 
filter(df, x > 1)
#> # A tibble: 1 × 1 #>
x
#> <dbl>
#> 1 3

含有 NA 的行就没有筛选到

1
2
3
4
5
NA > 5 #> [1] NA 
10 == NA #> [1] NA
NA + 10 #> [1] NA
NA / 2 #> [1] NA
NA == NA #> NA 特别要注意!!!

最后我们通过几个小练习来感受下 filter() 的便捷之处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# a. 到达时间延误2小时或更多的航班。
filter(flights, arr_delay >= 120)

# b. 飞往休斯顿(IAH 机场或 HOU 机场)的航班。
filter(flights, dest == 'IAH' | dest == 'HOU')
filter(flights, dest %in% c('IAH','HOU'))

# c. 由联合航空(United)、美利坚航空(American)或三角洲航空(Delta)运营的航班。
filter(flights, carrier %in% c("AA", "DL", "UA"))

# d. 夏季(7月、8月和9月)出发的航班。
filter(flights,month >=7,month <=9)
filter(flights,month %in% 7:9)

# e. 到达时间延误超过2小时,但出发时间没有延误的航班。
filter(flights,arr_delay >120 ,dep_delay <= 0)

# f. 延误至少1小时,但飞行过程弥补回30分钟的航班。
filter(flights, dep_delay >= 60, dep_delay - arr_delay > 30)

# g. 出发时间在午夜和早上6点之间(包括0点和6点)的航班
filter(flights, dep_time %% 2400 <= 600)

tips:使用attach(flights)可以将 flights 中的变量加载到缓存中,这样我们在输入时就会有提示,提高效率和准确率

今天的内容就到这里吧,往往有多个方法可以达到同一筛选目的,使用过程中我们将体验到各种方法适用的情形,
后面几节我们将继续探讨 dplyr 的其他函数及高阶用法。

# R

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×