You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调试R中用dplyr分组计算arr_delay标准差的NA结果问题?

解决nycflights13中计算延误标准差全为NA的问题

我来帮你搞定这个问题!你的代码逻辑方向是对的,但结果全NA主要有两个核心原因,咱们一步步拆解解决:

问题根源分析

  1. 缺失值未处理:arr_delay字段本身存在大量缺失值(你可以用sum(is.na(flights$arr_delay))查看总数),而R的sd()函数默认参数na.rm=FALSE——只要向量里有一个NA,结果就会返回NA。
  2. 样本量不足:部分航空公司(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:53:11