【问题标题】:Plotting mean and standard deviation for every numeric value in data frame in R绘制R中数据框中每个数值的平均值和标准差
【发布时间】:2022-07-05 22:35:08
【问题描述】:

我想用平均值作为条形图绘制每个数字列,标准差是一条穿过条形的线。如何为 iris 数据集执行此操作?

我正在尝试转换我的数据集,以便在 ggplot2 中轻松绘图。

我尝试过的

iris %>%
  dplyr::select_if(is.numeric) %>%
  dplyr::summarise(avg_sepal_length = mean(Sepal.Length),
                  avg_sepal_width = mean(Sepal.Width),
                  avg_petal_length = mean(Petal.Length),
                  avg_petal_width = mean(Petal.Width),
                  sd_sepal_length = sd(Sepal.Length),
                  sd_sepal_width = sd(Sepal.Width),
                  sd_petal_length = sd(Petal.Length),
                  sd_petal_width = sd(Petal.Width))

我想转成两列,所以数据框看起来像这样:

stat            mean            sd
sepal_length    5.843333        0.8280661        
sepal_width     3.057333        0.4358663
petal_length    3.758           1.765298    
pedal_width     1.199333        0.7622377

然后将上限和下限绘制为 sd 和 the 的一条线。表示为 ggplot 中的条形

【问题讨论】:

    标签: r ggplot2 dplyr


    【解决方案1】:

    您的输出格式不是ggplot2 的最佳格式,它更喜欢它:

    
    library(tidyr); library(dplyr)
    
    iris %>%
      summarise(
            across(
                where(is.double), 
                list(mean = mean, sd = sd)
            )
        )  |>
        pivot_longer(
            everything(), 
            names_sep = "_", 
            names_to = c("feature", "stat")
        )  
    
    
    # A tibble: 8 x 3
    #   feature      stat  value
    #   <chr>        <chr> <dbl>
    # 1 Sepal.Length mean  5.84
    # 2 Sepal.Length sd    0.828
    # 3 Sepal.Width  mean  3.06
    # 4 Sepal.Width  sd    0.436
    # 5 Petal.Length mean  3.76
    # 6 Petal.Length sd    1.77
    # 7 Petal.Width  mean  1.20
    # 8 Petal.Width  sd    0.762
    
    

    由于您熟悉 iris 数据集,因此值得查看 docsacross 的大量使用。

    【讨论】:

      【解决方案2】:

      为了达到您想要的结果,您可以首先使用dplyr::across 简化您的代码。之后,您可以通过pivot_longer 转换为long,从而使用.value 允许将means 和sds 放在它们自己的列中。最后,您可以将您的情节组合为例如geom_colgeom_pointrange:

      library(dplyr)
      library(tidyr)
      library(ggplot2)
      
      iris_sum <- iris %>%
        summarise(across(where(is.numeric), .fns = list(avg = mean, sd = sd), .names = "{.fn}_{.col}")) |> 
        pivot_longer(everything(), names_to = c(".value", "name"), names_sep = "_") |> 
        mutate(name = gsub("\\.", '_', tolower(name)))
      
      iris_sum
      #> # A tibble: 4 × 3
      #>   name           avg    sd
      #>   <chr>        <dbl> <dbl>
      #> 1 sepal_length  5.84 0.828
      #> 2 sepal_width   3.06 0.436
      #> 3 petal_length  3.76 1.77 
      #> 4 petal_width   1.20 0.762
      
      ggplot(iris_sum, aes(name, avg)) +
        geom_col() +
        geom_pointrange(aes(ymin = avg - sd, ymax = avg + sd))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 2011-08-09
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2017-08-30
        相关资源
        最近更新 更多