我正在研究R4DS,目前正在进行5.6.7练习(https://r4ds.had.co.nz/transform.html#exercises-11)。
这里的第一点要求考虑一些有关典型航班延误特性的方案。第一个子项目是“航班在50%的时间早15分钟,在50%的时间晚15分钟”。
我想在“ nycflights13”数据集中找到具有相等数量的晚到达时间15分钟以及早到达时间15分钟的航班。
至此,我创建了一个新的数据框,其中仅包含年,月,日,尾号和到达延迟。我还使用dplyr进行了变异,并添加了“ 15_min_delay”和“ 15_min_early”逻辑列。
接下来,我使用plyr进行过滤以创建一个新的数据框,该数据框仅包含提前15分钟或延迟15分钟的航班。
从这里开始,我想对tailnum进行group_by,发现我有大约2.7k个唯一的tailnum,但是我有9266个观测值。因此,我知道将重复一些尾巴。
创建完成后r odd_delays_new
,我迷路了。我尝试创建一个带有ifelse的for循环,以遍历所有9,266个观察值,并为延迟计数器或早期计数器+1,但这给了我一个错误。
odd_delays <- flights %>%
select(year, month, day, tailnum, arr_delay) %>%
mutate("15_minute_delay" = arr_delay == 15, "15_minute_early" = arr_delay == -15)
length(odd_delays$"15_minute_delay"[odd_delays$"15_minute_delay" == TRUE])
length(odd_delays$"15_minute_early"[odd_delays$"15_minute_early" == TRUE])
odd_delays_new <- odd_delays %>%
filter(odd_delays$`15_minute_delay` == TRUE | odd_delays$`15_minute_early` == TRUE)
ifelse(odd_delays_new$`15_minute_delay` == TRUE, delay = delay + 1, early = early + 1)
我希望结果是3列数据框。第一列将包含尾号,第二列将包含飞机延迟15分钟到达的次数,第三列将包含飞机提前15分钟到达的次数。
我将分两部分回答。
要回答您的问题,您可以留在dplyr
管道内。我相信这本书的意思是至少早/晚15分钟,所以我用了>=
,<=
您想了解延迟/早到与总数的关系,因此您需要首先找到分母。n()
是基于分组的观察数。然后,我使用sum()
这些逻辑结果。如果您要求sum()
或进行其他数学运算,R会将逻辑值视为0,1 。
off_schedule <-
flights %>%
group_by(tailnum) %>%
summarise(
n = n(),
delay_15min = sum(arr_delay >= 15, na.rm = TRUE),
early_15min = sum(arr_delay <= -15, na.rm = TRUE)
) %>%
ungroup() %>%
mutate(
delay_pct = delay_15min/n*100,
early_pct = early_15min/n*100,
off_pct = delay_pct + early_pct
)
这给我们下表:
# tailnum n delay_15min early_15min delay_pct early_pct off_pct
# <chr> <int> <int> <int> <dbl> <dbl> <dbl>
# D942DN 4 2 0 50 0 50
# N0EGMQ 371 95 73 25.6 19.7 45.3
# N10156 153 51 34 33.3 22.2 55.6
# N102UW 48 7 13 14.6 27.1 41.7
# N103US 46 2 13 4.35 28.3 32.6
为了使循环正常工作,您必须使用索引值。
for (i in 1:nrow(odd_delays)){
if(odd_delays_new$`15_minute_delay`[i] == TRUE){
odd_delays_new$delay[i] <- odd_delays_new$delay[i-1] + 1
}
if(odd_delays_new$`15_minute_early`[i] == TRUE){
odd_delays_new$early[i] <- odd_delays_new$early[i-1] + 1
}
}
三年后写作或阅读都不好玩。幸运的是,该cumsum()
函数可以将它们相加:
df <-
odd_delays_new %>%
group_by(tailnum) %>%
mutate(
delay = cumsum(`15_minute_delay`),
early = cumsum(`15_minute_early`)
) %>%
ungroup()
但是,该解决方案并不能帮助您了解航班延误的频率N0EGMQ
,而只是告诉您N0EGMQ
航班延误的航班,延误与提前到达之间的关系。
我希望这有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句