如何调试R中用dplyr分组计算arr_delay标准差的NA结果问题?
解决nycflights13中计算延误标准差全为NA的问题
我来帮你搞定这个问题!你的代码逻辑方向是对的,但结果全NA主要有两个核心原因,咱们一步步拆解解决:
问题根源分析
- 缺失值未处理:
arr_delay字段本身存在大量缺失值(你可以用sum(is.na(flights$arr_delay))查看总数),而R的sd()函数默认参数na.rm=FALSE——只要向量里有一个NA,结果就会返回NA。 - 样本量不足:部分航空公司(carrier)的有效延误数据少于2条,即使去掉NA,
sd()也会返回NA(因为标准差计算需要至少两个数据点)。
另外,你代码里的as.numeric(arr_delay)其实是多余的,arr_delay本身就是数值型字段,用class(flights$arr_delay)就能确认这一点。
修正后的代码
先看带诊断信息的版本,帮你清晰看到每个分组的情况:
library(tidyverse) library(nycflights13) flights_2c <- flights %>% filter(origin == "JFK" & dest == "BOS") %>% group_by(carrier) %>% summarise( sd_arr = sd(arr_delay, na.rm = TRUE), # 关键:加上na.rm=TRUE忽略缺失值 total_flights = n(), # 该航空公司的总航班数 valid_delay_count = sum(!is.na(arr_delay)) # 有有效延误数据的航班数 ) %>% filter(valid_delay_count >= 2) # 可选:过滤掉无法计算标准差的分组
如果只需要最终的标准差结果,也可以简化成:
flights_2c <- flights %>% filter(origin == "JFK" & dest == "BOS") %>% group_by(carrier) %>% summarise(sd_arr = sd(arr_delay, na.rm = TRUE)) %>% drop_na(sd_arr) # 去掉仍为NA的分组(即有效数据不足2条的情况)
验证结果
运行修正后的代码后,你会看到sd_arr列不再全是NA,同时total_flights和valid_delay_count能帮你判断每个标准差结果的可靠性——如果某个分组的valid_delay_count很小,对应的标准差参考价值也会很低。
内容的提问来源于stack exchange,提问作者Aaron Spencer Phalin
相关产品推荐
相关产品推荐

