《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分钟或以上的航班。
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”的航班。
##方法一 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>
##方法二 filter(flights, dest %in% c("IAH", "HOU"))
- c. 查找
carrier
为“UA”,“AA”,“DL”的航班。
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的航班。
##方法一 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>
##方法二 filter(flights, month %in% 7:9) ##方法三 filter(flights, month == 7 | month == 8 | month == 9)
- e. 查找
arr_delay > 120
且dep_delay <= 0
的航班。
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 >= 60
且dep_delay - arr_delay > 30
的航班。
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点)的航班。
##由于数据中时间的表示方式,查找在午夜到早上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
filter(flights, between(month, 7, 9)) filter(flights, month >= 7, month <= 9)
问题三
dep_time
有缺失值的航班有多少?其他变量的缺失值情况如何?这样的行表示什么情况?
解答
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 则是精妙的反例!)
解答
NA ^ 0 #> [1] 1
NA ^ 0 == 1
因为:
##这三个运算都是逻辑运算 NA | TRUE #> [1] TRUE NA & FALSE #> [1] FALSE NA & TRUE #> [1] NA
NA * 0 #> [1] NA Inf * 0 #> [1] NaN -Inf * 0 #> [1] NaN