R语言aggregate()与tidyverse计算航班延误均值差异原因问询
差异产生原因
这个差异确实是由NA值的处理逻辑不同导致的,核心区别在于两种写法删除缺失值的范围不一样:
- base R的
aggregate()使用公式语法(cbind(arr_delay,dep_delay) ~ origin)时,默认采用na.action = na.omit的逻辑:只要行内参与公式计算的arr_delay、dep_delay任意一列存在NA,整行都会被从计算中剔除,算两个均值的时候用的是完全相同的、没有任何缺失值的行子集。 - 你写的tidyverse代码中,
summarise内为每个mean()单独配置了na.rm = TRUE,此时删除缺失值的逻辑是单列独立的:计算arr_delay均值时仅剔除arr_delay为NA的行(哪怕对应行的dep_delay是NA也会纳入计算),计算dep_delay均值时仅剔除dep_delay为NA的行,两个均值计算用到的行子集范围不一样,最终结果自然和aggregate的输出有微小差异。
验证方法
你可以先把数据集过滤为arr_delay和dep_delay都非NA的子集,再用两种方法计算:
flights_complete <- flights %>% filter(!is.na(arr_delay), !is.na(dep_delay))
之后在flights_complete上运行你原来的两段代码,输出结果会完全一致。
内容的提问来源于stack exchange,提问作者Wutruvic
相关产品推荐
相关产品推荐

