【问题标题】:How to use a prior median in ggplot aesthetic in R?如何在 R 中的 ggplot 美学中使用先验中位数?
【发布时间】:2019-05-09 20:24:29
【问题描述】:

我正在尝试将中位数计算为一个数字,然后将该数字用作 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() 

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

谢谢!

【问题讨论】:

    标签: r ggplot2 median


    【解决方案1】:

    你只是错过了summarise(median_all_delay = median(mean_delay, na.rm = TRUE))

    试试这个:

    mean_delay_median <- nycflights13::flights %>% 
      group_by(dest) %>%
      summarise(mean_delay = mean(arr_delay, na.rm = TRUE)) %>% 
      summarise(median_all_delay = median(mean_delay, na.rm = TRUE)) %>% 
      unlist()
    
    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() 
    

    输出是:

    【讨论】:

      【解决方案2】:

      您应该注意,一个目的地 (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
      

      也就是说,你应该在median函数中再次添加na.rm = TRUE

      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

      【讨论】:

      • 感谢这种方法在这里很好用,我刚刚添加了 filter(!is.na(mean_delay)) 以从图例中删除 NA。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多