R数据科学|3.2.4课后习题

2021-04-09 11:03:50 浏览数 (2)

《R数据科学》是一本很好的R学习教材,这里给出第三章3.2.4[1]习题解答,仅供参考。如有误,望指正。

问题一

找出满足以下条件的所有航班:

  • a. 到达时间延误 2 小时或更多的航班。
  • b. 飞往休斯顿(IAH 机场或 HOU 机场)的航班。
  • c. 由联合航空(United)、美利坚航空(American)或三角洲航空(Delta)运营的航班。
  • d. 夏季(7 月、8 月和 9 月)出发的航班。
  • e. 到达时间延误超过 2 小时,但出发时间没有延误的航班。
  • f. 延误至少 1 小时,但飞行过程弥补回 30 分钟的航班。
  • g. 出发时间在午夜和早上 6 点之间(包括 0 点和 6 点)的航班。

解答

  • a. 由于arr_delay以分钟为单位,因此查找到达延迟为120分钟或以上的航班。
代码语言:javascript复制
filter(flights, arr_delay >= 120)
#> # A tibble: 10,200 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      811            630       101     1047            830
#> 2  2013     1     1      848           1835       853     1001           1950
#> 3  2013     1     1      957            733       144     1056            853
#> 4  2013     1     1     1114            900       134     1447           1222
#> 5  2013     1     1     1505           1310       115     1638           1431
#> 6  2013     1     1     1525           1340       105     1831           1626
#> # … with 10,194 more rows, and 11 more variables: 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>
  • b. 查找dest为“IAH”或“HOU”的航班。
代码语言:javascript复制
##方法一
filter(flights, dest == "IAH" | dest == "HOU")
#> # A tibble: 9,313 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      623            627        -4      933            932
#> 4  2013     1     1      728            732        -4     1041           1038
#> 5  2013     1     1      739            739         0     1104           1038
#> 6  2013     1     1      908            908         0     1228           1219
#> # … with 9,307 more rows, and 11 more variables: 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>
代码语言:javascript复制
##方法二
filter(flights, dest %in% c("IAH", "HOU"))
  • c. 查找carrier为“UA”,“AA”,“DL”的航班。
代码语言:javascript复制
filter(flights, carrier %in% c("AA", "DL", "UA"))
#> # A tibble: 139,504 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      554            600        -6      812            837
#> 5  2013     1     1      554            558        -4      740            728
#> 6  2013     1     1      558            600        -2      753            745
#> # … with 139,498 more rows, and 11 more variables: 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>
  • d. 查找month为7,8,9的航班。
代码语言:javascript复制
##方法一
filter(flights, month >= 7, month <= 9)
#> # A tibble: 86,326 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     7     1        1           2029       212      236           2359
#> 2  2013     7     1        2           2359         3      344            344
#> 3  2013     7     1       29           2245       104      151              1
#> 4  2013     7     1       43           2130       193      322             14
#> 5  2013     7     1       44           2150       174      300            100
#> 6  2013     7     1       46           2051       235      304           2358
#> # … with 86,320 more rows, and 11 more variables: 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>
代码语言:javascript复制
##方法二
filter(flights, month %in% 7:9)
##方法三
filter(flights, month == 7 | month == 8 | month == 9)
  • e. 查找arr_delay > 120dep_delay <= 0的航班。
代码语言:javascript复制
filter(flights, arr_delay > 120, dep_delay <= 0)
#> # A tibble: 29 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1    27     1419           1420        -1     1754           1550
#> 2  2013    10     7     1350           1350         0     1736           1526
#> 3  2013    10     7     1357           1359        -2     1858           1654
#> 4  2013    10    16      657            700        -3     1258           1056
#> 5  2013    11     1      658            700        -2     1329           1015
#> 6  2013     3    18     1844           1847        -3       39           2219
#> # … with 23 more rows, and 11 more variables: 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>
  • f. 查找dep_delay >= 60dep_delay - arr_delay > 30的航班。
代码语言:javascript复制
filter(flights, dep_delay >= 60, dep_delay - arr_delay > 30)
#> # A tibble: 1,844 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1     2205           1720       285       46           2040
#> 2  2013     1     1     2326           2130       116      131             18
#> 3  2013     1     3     1503           1221       162     1803           1555
#> 4  2013     1     3     1839           1700        99     2056           1950
#> 5  2013     1     3     1850           1745        65     2148           2120
#> 6  2013     1     3     1941           1759       102     2246           2139
#> # … with 1,838 more rows, and 11 more variables: 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>
  • g. 查找出发时间在午夜和早上6点之间(包括0点和6点)的航班。
代码语言:javascript复制
##由于数据中时间的表示方式,查找在午夜到早上6点之间起飞的航班变得很复杂。
##在dep_time中,午夜用2400表示,而不是0。您可以通过检查dep_time的最小值和最大值来验证这一点。
summary(flights$dep_time)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>       1     907    1401    1349    1744    2400    8255
##可以使用模运算符%%。模运算符返回除法的余数。
##由于2400% % 2400 == 0和其他所有时间不变,我们可以将模运算的结果与600进行比较。
filter(flights, dep_time %% 2400 <= 600)
#> # A tibble: 9,373 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 9,367 more rows, and 11 more variables: 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>

问题二

dplyr中对筛选有帮助的另一个函数是 between()。它的作用是什么?你能使用这个函数来简化解决前面问题的代码吗?

解答

between(x, left, right)等价于x >= left & x <= right

代码语言:javascript复制
filter(flights, between(month, 7, 9))
filter(flights, month >= 7, month <= 9)

问题三

dep_time有缺失值的航班有多少?其他变量的缺失值情况如何?这样的行表示什么情况?

解答

代码语言:javascript复制
filter(flights, is.na(dep_time))
#> # A tibble: 8,255 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1       NA           1630        NA       NA           1815
#> 2  2013     1     1       NA           1935        NA       NA           2240
#> 3  2013     1     1       NA           1500        NA       NA           1825
#> 4  2013     1     1       NA            600        NA       NA            901
#> 5  2013     1     2       NA           1540        NA       NA           1747
#> 6  2013     1     2       NA           1620        NA       NA           1746
#> # … with 8,249 more rows, and 11 more variables: 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>

值得注意的是,这些行也没有arr_time。这些航班似乎被取消了。

问题四

为什么 NA ^ 0 的值不是 NA ?为什么 NA | TRUE 的值不是 NA ?为什么 FALSE & NA 的值不是 NA ?你能找出一般规律吗?(NA * 0 则是精妙的反例!)

解答

代码语言:javascript复制
NA ^ 0
#> [1] 1

NA ^ 0 == 1因为:

x ^ 0 = 1
代码语言:javascript复制
##这三个运算都是逻辑运算
NA | TRUE
#> [1] TRUE
NA & FALSE
#> [1] FALSE
NA & TRUE
#> [1] NA
代码语言:javascript复制
NA * 0
#> [1] NA
Inf * 0
#> [1] NaN
-Inf * 0
#> [1] NaN

参考资料

[1]

R数据科学: https://jrnold.github.io/r4ds-exercise-solutions

0 人点赞