在R中对Flights数据集使用Mutate时出现计算错误?
嘿,这个问题我刚好研究过!咱们一步步来搞清楚为什么会出现这种差异:
为什么直接计算的
diff和dep_delay数值不一致? 1. 核心问题:时间变量的存储格式
首先得明确:flights里的dep_time和sched_dep_time并不是真正的时间戳或分钟数,而是以HHMM格式存储的整数。举个例子:
- 凌晨0点15分被存成
15 - 晚上11点29分被存成
2329
直接对这两个整数做减法,只会得到纯粹的数值差,完全不会考虑「日期跨天」的情况——这就是异常值的来源。
2. 跨午夜航班的计算偏差
你看到的diff=-46这类异常值,都是跨午夜的航班导致的。比如某航班:
- 计划起飞时间是第二天凌晨的
0015(存为整数15) - 实际起飞时间是前一天晚上的
2329(存为整数2329)
直接做数值减法会得到2329 - 15 = 2314,但这显然不是真实的时间差;如果是实际起飞时间的分钟数小于计划值(比如实际109、计划155),直接相减会得到-46,但这个负数并不是真实的延迟时长。
而dep_delay字段是官方已经正确计算好的:它结合了航班的year/month/day(实际起飞的日期)和计划起飞时间对应的日期,把所有时间都转换成「从当天0点开始的分钟数」,再处理跨天情况(如果实际起飞在前一天,就给实际时间加上24*60=1440分钟),最后算出真实的延迟值——这就是为什么你看到dep_delay=-6才是正确结果。
3. 验证逻辑的代码
你可以用这段代码自己验证,把时间转换成分钟数并修正跨天情况后,结果会和dep_delay完全一致:
library(nycflights13) library(tidyverse) flights %>% mutate( # 把HHMM格式的整数转成当天的分钟数 dep_min = (dep_time %/% 100)*60 + (dep_time %% 100), sched_dep_min = (sched_dep_time %/% 100)*60 + (sched_dep_time %% 100), # 处理跨天情况:实际分钟数小于计划时,加1440分钟再计算差值 correct_diff = case_when( dep_min < sched_dep_min ~ dep_min + 1440 - sched_dep_min, TRUE ~ dep_min - sched_dep_min ) ) %>% select(dep_time, sched_dep_time, dep_delay, correct_diff) %>% head(10) # 查看前10行的对比
内容的提问来源于stack exchange,提问作者Forevertrip
相关产品推荐
相关产品推荐

