首页 > 解决方案 > 如何在 R 中的 ggplot 美学中使用先验中位数?

问题描述

我正在尝试将中位数计算为一个数字,然后将该数字用作 ggplot 美学中的值。

我首先尝试获取中值作为值:

mean_delay_median <- nycflights13::flights %>% 
  group_by(dest) %>%
  summarise(mean_delay = mean(arr_delay, na.rm = TRUE)) %>% 
  median(mean_delay)

这会产生错误消息:

Error in median.default(., mean_delay) : need numeric data

我怎样才能解决这个问题?

一旦我得到这个工作,我的第二步是根据高于和低于这个中值“mean_delay_median”的值为地图着色,如下所示:

nycflights13::flights %>% 
  group_by(dest) %>%
  summarise(mean_delay = mean(arr_delay, na.rm = TRUE)) %>% 
  inner_join(nycflights13::airports, c('dest' = 'faa')) %>% 
  ggplot(aes(lon, lat, color=mean_delay>mean_delay_median)) +
  borders("state") +
  geom_point() +
  coord_quickmap() 

一般来说,我寻求在后续代码中使用先前统计数据的指导。

谢谢!

标签: rggplot2median

解决方案


你应该注意到一个destination( dest)arr_delay丢失了所有的观察。

library(tidyverse)
library(nycflights13)

flights %>% 
  group_by(dest) %>% 
  filter(all(is.na(arr_delay))) %>% 
  select(dest, arr_delay)
#> # A tibble: 1 x 2
#> # Groups:   dest [1]
#>   dest  arr_delay
#>   <chr>     <dbl>
#> 1 LGA          NA

这导致NaN,而不是零。

mean(c(NA), na.rm = TRUE)
#> [1] NaN

换句话说,您应该在函数中na.rm = TRUE再次添加。median

flights %>% 
  group_by(dest) %>% 
  summarise(mean_delay = mean(arr_delay, na.rm = TRUE)) %>% 
  mutate(arrival = ifelse(mean_delay > median(mean_delay, na.rm = TRUE), "late", "okay")) %>% # na.rm option to median
  inner_join(airports, by = c("dest" = "faa")) %>% 
  ggplot() +
  aes(lon, lat, colour = arrival) +
  borders("state") +
  geom_point() +
  coord_quickmap()

在此处输入图像描述

由于 的平均值LGA没有任何值,它的标签可能变成NA


推荐阅读