《R数据科学》课后练习题:第三章(2)
(1)虽然现在的deep_time和sched_dep_time变量方便阅读,但不适合计算,因为他们实际上并不是连续型数值。将他们转换成一种更方便的表示形式,即从午夜开始的分钟数。
flight_new <-< span=""> mutate(flights,
dep_time_min = (dep_time %/% 100 * 60 + dep_time %% 100) %% 1440,
sched_dep_time_min = (sched_dep_time %/% 100 * 60 + sched_dep_time %% 100) %% 1440
)
#为避免代码冗余,可以构建一个函数
time2min <-< span=""> function(x){
(x %/% 100 * 60 + x %% 100) %% 1440
}
flight_new <-< span=""> mutate(flights,
dep_time_min = time2min(dep_time),
sched_dep_time_min = time2min(sched_dep_time)
)
(2)比较air_time和arr_time - dep_time。你期望看到什么?实际又看到了什么?如何解决这个问题?
期望看到air_time等于arr_time - dep_time,但实际上air_time小于arr_time - dep_time,原因在于air_time不包括飞机在跑道滑行的时间和着陆滑行时间,专门指从起飞到进入着陆之间的时间。
(3)比较dep_time、sched_dep_time和dep_delay。你期望这三个数值之间具有何种关系?
期望出发延迟(dep_delay)等于预定出发时间(sched_dep_time)与实际出发时间(dep_time) 之间的差,即:dep_time - sched_dep_time = dep_delay
有一部分航班与期望有差异,可能是因为原定的航班在午夜之前出发,但在午夜之后推迟了。所有这些差异完全等于1440(24小时)。
flights_deptime <-< span=""> mutate(flights,
dep_time_min = (dep_time %/% 100 * 60 + dep_time %% 100) %% 1440,
sched_dep_time_min = (sched_dep_time %/% 100 * 60 + sched_dep_time %% 100) %% 1440,
dep_delay_diff = dep_delay - dep_time_min + sched_dep_time_min
)
suppressWarnings(library(ggplot2))
ggplot(filter(flights_deptime, dep_delay_diff > 0),
aes(y = sched_dep_time_min, x = dep_delay_diff)
) + geom_point()
(4)使用排秩函数找出10个延误时间最长的航班。如何处理名次相同的情况?仔细阅读min_rank的帮助文档。
#法一:
top_n(flights, 10, dep_delay)
## # A tibble: 10 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##
## 1 2013 1 9 641 900 1301 1242 1530
## 2 2013 1 10 1121 1635 1126 1239 1810
## 3 2013 12 5 756 1700 896 1058 2020
## 4 2013 3 17 2321 810 911 135 1020
## 5 2013 4 10 1100 1900 960 1342 2211
## 6 2013 6 15 1432 1935 1137 1607 2120
## 7 2013 6 27 959 1900 899 1236 2226
## 8 2013 7 22 845 1600 1005 1044 1815
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 9 20 1139 1845 1014 1457 2210
## # ... with 11 more variables: arr_delay, carrier, flight,
## # tailnum, origin, dest, air_time, distance,
## # hour, minute, time_hour
#法二:
flights_delayed <-< span=""> mutate(flights,
dep_delay_min_rank = min_rank(desc(dep_delay))
)
flights_delayed <-< span=""> filter(flights_delayed,
dep_delay_min_rank <=< span=""> 10 )
arrange(flights_delayed, dep_delay_min_rank)
## # A tibble: 10 x 20
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##
## 1 2013 1 9 641 900 1301 1242 1530
## 2 2013 6 15 1432 1935 1137 1607 2120
## 3 2013 1 10 1121 1635 1126 1239 1810
## 4 2013 9 20 1139 1845 1014 1457 2210
## 5 2013 7 22 845 1600 1005 1044 1815
## 6 2013 4 10 1100 1900 960 1342 2211
## 7 2013 3 17 2321 810 911 135 1020
## 8 2013 6 27 959 1900 899 1236 2226
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 12 5 756 1700 896 1058 2020
## # ... with 12 more variables: arr_delay, carrier, flight,
## # tailnum, origin, dest, air_time, distance,
## # hour, minute, time_hour, dep_delay_min_rank
#法三:
全部内容见茶与生信公众号