美文网首页R数据科学
R数据科学》学习笔记|Note4:使用dplyr进行数据转换(上

R数据科学》学习笔记|Note4:使用dplyr进行数据转换(上

作者: 木舟笔记 | 来源:发表于2021-02-22 20:52 被阅读0次

    原文链接:

    R数据科学》学习笔记|Note4:使用dplyr进行数据转换(上)

    3.1

    简介

    一般来说,你需要创建一些新变量或者摘要统计量,还可能对变量进行重命名或对观测值进行重新排序,以便数据更容易处理。你将在本章中学会如何进行这些甚至更多操作,本章将教会你如何使用 dplyr 包来转换数据,并介绍一个新的数据集:2013 年从纽约市出发的航班信息。

    3.1.1

    准备工作

    本章将重点讨论如何使用 tidyverse 中的另一个核心 R 包—dplyr 包。我们使 用nycflights13 包中的数据来说明 dplyr 包的核心理念,并使用 ggplot2 来帮助我们理解数据。

    1BiocManager::install('nycflights13')

    2library(nycflights13)

    3library(tidyverse)

    3.1.2

    nycflights13

    为了介绍 dplyr 中的基本数据操作,我们需要使用 nycflights13::flights。这个数据框包含了 2013 年从纽约市出发的所有 336 776 次航班的信息。该数据来自于美国交通统计局,可以使用 ?flights 查看其说明文档:

    1> flights

    2# A tibble: 336,776 x 19

    3    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay

    4                                           

    5 1  2013     1     1      517            515         2      830            819        11

    6 2  2013     1     1      533            529         4      850            830        20

    7 3  2013     1     1      542            540         2      923            850        33

    8 4  2013     1     1      544            545        -1     1004           1022       -18

    9 5  2013     1     1      554            600        -6      812            837       -25

    10 6  2013     1     1      554            558        -4      740            728        12

    11 7  2013     1     1      555            600        -5      913            854        19

    12 8  2013     1     1      557            600        -3      709            723       -14

    13 9  2013     1     1      557            600        -3      838            846        -8

    1410  2013     1     1      558            600        -2      753            745         8

    15# ... with 336,766 more rows, and 10 more variables: carrier , flight ,

    16#   tailnum , origin , dest , air_time , distance , hour ,

    17#   minute , time_hour 

    这个数据框的输出和我们以前用过的其他数据框有一点差别:只显示了前几行和适合屏幕宽度的几列。(要想看到整个数据集,可以使用 View(flights) 在 RStudio查看器中打开数据集。)

    列名下面有一行 3 个或 4 个字母的缩写。它们描述了每个变量的类型。

    • int 表示整数型变量。

    • dbl 表示双精度浮点数型变量,或称实数。

    • chr 表示字符向量,或称字符串。

    • dttm 表示日期时间(日期 + 时间)型变量。

    还有另外 3 种常用的变量类型,虽然没有在这个数据集中出现,但很快就会在本书后面遇到。 

    • lgl 表示逻辑型变量,是一个仅包括 TRUE 和 FALSE 的向量。

    • fctr 表示因子,R 用其来表示具有固定数目的值的分类变量。

    • date 表示日期型变量。

    3.1.3

    dplyr 基础

    本章将学习 5 个 dplyr 核心函数。

    • 按值筛选观测(filter())。

    • 对行进行重新排序(arrange() )。

    • 按名称选取变量(select() )。

    • 使用现有变量的函数创建新变量(mutate() )。

    • 将多个值总结为一个摘要统计量(summarize())。

    这些函数都可以和 group_by() 函数联合起来使用,group_by() 函数可以改变以上每个函数的作用范围,让其从在整个数据集上操作变为在每个分组上分别操作。这 6 个函数构成了数据处理语言的基本操作。

    3.2

    使用filter() 筛选行

    filter() 函数可以基于观测的值筛选出一个观测子集。第一个参数是数据框名称,第二个参数以及随后的参数是用来筛选数据框的表达式。例如,我们可以使用以下代码筛选出 1月 1 日的所有航班:

    1> filter(flights, month == 1, day == 1)

    2# A tibble: 842 x 19

    3    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay

    4                                           

    5 1  2013     1     1      517            515         2      830            819        11

    6 2  2013     1     1      533            529         4      850            830        20

    7 3  2013     1     1      542            540         2      923            850        33

    8 4  2013     1     1      544            545        -1     1004           1022       -18

    9 5  2013     1     1      554            600        -6      812            837       -25

    10 6  2013     1     1      554            558        -4      740            728        12

    11 7  2013     1     1      555            600        -5      913            854        19

    12 8  2013     1     1      557            600        -3      709            723       -14

    13 9  2013     1     1      557            600        -3      838            846        -8

    1410  2013     1     1      558            600        -2      753            745         8

    15# ... with 832 more rows, and 10 more variables: carrier , flight , tailnum ,

    16#   origin , dest , air_time , distance , hour , minute ,

    17#   time_hour 

    如果运行这行代码,dplyr 就会执行筛选操作,并返回一个新数据框。dplyr 函数从来不修改输入,因此,如果想要保存函数结果,那么你就需要使用赋值操作符 <-:

    1jan1 <- filter(flights, month == 1, day == 1)

    R 要么输出结果,要么将结果保存在一个变量中。如果想同时完成这两种操作,那么你可以用括号将赋值语句括起来:

    1> (dec25 <- filter(flights, month == 12, day == 25))

    2# A tibble: 719 x 19

    3    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay

    4                                           

    5 1  2013    12    25      456            500        -4      649            651        -2

    6 2  2013    12    25      524            515         9      805            814        -9

    7 3  2013    12    25      542            540         2      832            850       -18

    8 4  2013    12    25      546            550        -4     1022           1027        -5

    9 5  2013    12    25      556            600        -4      730            745       -15

    10 6  2013    12    25      557            600        -3      743            752        -9

    11 7  2013    12    25      557            600        -3      818            831       -13

    12 8  2013    12    25      559            600        -1      855            856        -1

    13 9  2013    12    25      559            600        -1      849            855        -6

    1410  2013    12    25      600            600         0      850            846         4

    15# ... with 709 more rows, and 10 more variables: carrier , flight , tailnum ,

    16#   origin , dest , air_time , distance , hour , minute ,

    17#   time_hour 

    3.2.1

    比较运算符

    为了有效地进行筛选,你必须知道如何使用比较运算符来选择观测。R 提供了一套标准的比较运算符:>、>=、<、<=、!=(不等于)和 ==(等于)。当开始使用 R 时,最容易犯的错误就是使用 = 而不是 == 来测试是否相等。

    在使用 == 进行比较时,你可能还会遇到另一个常见问题:浮点数。下面的结果可能会令你目瞪口呆:

    1> sqrt(2) ^ 2 == 2

    2[1] FALSE

    3> #> [1] FALSE

    4> 1/49 * 49 == 1

    5[1] FALSE

    计算机使用的是有限精度运算(显然无法存储无限位的数),因此请记住,你看到的每个数都是一个近似值。比较浮点数是否相等时,不能使用 ==,而应该使用 near()

    1near(sqrt(2) ^ 2, 2)

    2#> [1] TRUE

    3near(1 / 49 * 49, 1)

    4#> [1] TRUE

    3.2.2

    逻辑运算符

    filter() 中的多个参数是由“与”组合起来的:每个表达式都必须为真才能让一行观测包含在输出中。如果要实现其他类型的组合,你需要使用布尔运算符:& 表示“与”、| 表示“或”、! 表示“非”。下图给出了布尔运算的完整集合。

    以下代码可以找出 11 月或 12 月出发的所有航班:

    1filter(flights, month == 11 | month == 12)

    表达式中的运算顺序和语言中的是不一样的。你不能写成 filter(flights, month == 11 |12) 这种形式。这种形式的文字翻译确实是“找出 11 月或 12 月出发的所有航班”,但在代码中则不是这个意思,代码中的含义是找出所有出发月份为 11 | 12 的航班。11 | 12 这个逻辑表达式的值为 TRUE,在数字语境中(如本例),TRUE 就是 1,所以这段代码找出的不是 11 月或 12 月出发的航班,而是 1 月出发的所有航班。

    这种问题有一个有用的简写形式:x %in% y。这会选取出 x 是 y 中的一个值时的所有行。我们可以使用这种形式重写上面的代码:

    1nov_dec <- filter(flights, month %in% c(11, 12))

    有时你可以使用德摩根定律将复杂的筛选条件进行简化:!(x & y)等价于

    !x | !y!(x |y)等价于 !x & !y。例如,如果想要找出延误时间(到达或出发)不多于 2 小时的航班,那么使用以下两种筛选方式均可:

    1filter(flights, !(arr_delay > 120 | dep_delay > 120))

    2filter(flights, arr_delay <= 120, dep_delay <= 120)

    3.2.3

    缺失值

    的一个重要特征使得比较运算更加复杂,这个特征就是缺失值,或称 NA(not available,不可用)。NA 表示未知的值,因此缺失值是“可传染的”。如果运算中包含了未知值,那么运算结果一般来说也是个未知值:

    1NA > 5

    2#> [1] NA

    310 == NA

    4#> [1] NA

    5NA + 10

    6#> [1] NA

    7NA / 2

    8#> [1] NA

    最令人费解的是以下这个结果:

    1NA == NA

    2#> [1] NA

    要想理解为什么会这样,最容易的方式是加入一点背景知识:

    1# 令x为Mary的年龄。我们不知道她有多大。

    2x <- NA

    3# 令y为John的年龄。我们不知道他有多大。

    4y <- NA

    5# John和Mary的年龄是相同的吗?

    6x == y

    7#> [1] NA

    8# 我们不知道!

    如果想要确定一个值是否为缺失值,可以使用 is.na() 函数:

    1> x <- NA

    2> is.na(x)

    3[1] TRUE

    filter() 只能筛选出条件为 TRUE 的行;它会排除那些条件为 FALSE  NA 的行。如果想保留缺失值,可以明确指出:

    1> df <- tibble(x = c(1, NA, 3))

    2> filter(df, x > 1)

    3# A tibble: 1 x 1

    4      x

    5  

    61     3

    7> filter(df, is.na(x) | x > 1)

    8# A tibble: 2 x 1

    9      x

    10  

    111    NA

    122     3

    3.3

    使用arrange()排列行

    arrange() 函数的工作方式与 filter() 函数非常相似,但前者不是选择行,而是改变行的顺序。它接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序:

    1arrange(flights, year, month, day)

    1> arrange(flights, year, month, day)

    2# A tibble: 336,776 x 19

    3    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay

    4                                           

    5 1  2013     1     1      517            515         2      830            819        11

    6 2  2013     1     1      533            529         4      850            830        20

    7 3  2013     1     1      542            540         2      923            850        33

    8 4  2013     1     1      544            545        -1     1004           1022       -18

    9 5  2013     1     1      554            600        -6      812            837       -25

    10 6  2013     1     1      554            558        -4      740            728        12

    11 7  2013     1     1      555            600        -5      913            854        19

    12 8  2013     1     1      557            600        -3      709            723       -14

    13 9  2013     1     1      557            600        -3      838            846        -8

    1410  2013     1     1      558            600        -2      753            745         8

    15# ... with 336,766 more rows, and 10 more variables: carrier , flight ,

    16#   tailnum , origin , dest , air_time , distance , hour ,

    17#   minute , time_hour 

    使用 desc() 可以按列进行降序排序:

    1> arrange(flights, desc(arr_delay))

    2# A tibble: 336,776 x 19

    3    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay

    4                                           

    5 1  2013     1     9      641            900      1301     1242           1530      1272

    6 2  2013     6    15     1432           1935      1137     1607           2120      1127

    7 3  2013     1    10     1121           1635      1126     1239           1810      1109

    8 4  2013     9    20     1139           1845      1014     1457           2210      1007

    9 5  2013     7    22      845           1600      1005     1044           1815       989

    10 6  2013     4    10     1100           1900       960     1342           2211       931

    11 7  2013     3    17     2321            810       911      135           1020       915

    12 8  2013     7    22     2257            759       898      121           1026       895

    13 9  2013    12     5      756           1700       896     1058           2020       878

    1410  2013     5     3     1133           2055       878     1250           2215       875

    15# ... with 336,766 more rows, and 10 more variables: carrier , flight ,

    16#   tailnum , origin , dest , air_time , distance , hour ,

    17#   minute , time_hour 

    缺失值总是排在最后:

    1> df <- tibble(x = c(5, 2, NA))

    2> arrange(df, x)

    3# A tibble: 3 x 1

    4      x

    5  

    61     2

    72     5

    83    NA

    9> arrange(df, desc(x))

    10# A tibble: 3 x 1

    11      x

    12  

    131     5

    142     2

    153    NA

    — END —

    往期 · 推荐

    《R数据科学》学习笔记|Note1:绪论

    《R数据科学》学习笔记|Note2:使用ggplot2进行数据可视化(上)

    《R数据科学》学习笔记|Note3:使用ggplot2进行数据可视化(下)

    零基础"机器学习"自学笔记|Note5:多变量线性回归

    零基础"机器学习"自学笔记|Note6:正规方程及其推导(内附详细推导过程)

    相关文章

      网友评论

        本文标题:R数据科学》学习笔记|Note4:使用dplyr进行数据转换(上

        本文链接:https://www.haomeiwen.com/subject/dinkfltx.html