【问题标题】:summarise with mean, median, range and quants in R用 R 中的平均值、中位数、范围和数量进行总结
【发布时间】:2021-11-24 21:25:25
【问题描述】:

我目前正在使用 R 中的 palmer penguins 数据集,并希望总结结合了均值、中位数、范围和数量的数据,并按性别分组。

我当前的解决方案将量化数据从汇总数据中分离出来。有没有办法一次性做到这一点。如果不是,我如何组合数据集。组 quant 目前是长格式,我不知道如何组合它们。

group_summary <- penguins %>% group_by(sex) %>% summarize(mean = mean(bill_length_mm, 
na.rm = TRUE), meadian = median(bill_length_mm, na.rm = TRUE), range = 
max(bill_length_mm, na.rm = TRUE) - min(bill_length_mm, na.rm = TRUE))

group_quant <- penguins %>% group_by(sex) %>% summarize(quantile(bill_length_mm, 
probs =seq(.1, 1, by = .1), na.rm =TRUE, .groups = 'drop'))

我有以下解决方案,但它会从 Sex 中删除 NA 值,我不知道为什么。

group_summary <- do.call(data.frame,aggregate(bill_length_mm ~ sex, penguins, 
function(x) c(mean = mean(x, na.rm = TRUE), median = median(x, na.rm = TRUE), range = 
max(x, na.rm = TRUE) - min(x, na.rm = TRUE), quantile(x, probs = seq(.1, 1, by = .1), 
na.rm = TRUE, .groups = 'drop'))))

【问题讨论】:

    标签: r mean median quantile summarize


    【解决方案1】:

    您可以将分位数保存在列表中,然后使用unnest_wider 从中创建新列。为了计算range,我使用diff(range(...)) 而不是max(...) - min(...)。他们都很好,但我把它包括在内是为了展示一个替代方案。

    library(palmerpenguins)
    library(dplyr)
    library(tidyr)
    
    penguins %>% 
      group_by(sex) %>% 
      summarize(mean = mean(bill_length_mm, na.rm = TRUE), 
                median = median(bill_length_mm, na.rm = TRUE), 
                range = diff(range(bill_length_mm, na.rm = TRUE)), 
                quantile = list(quantile(bill_length_mm, probs = seq(.1, 1, by = .1), na.rm = TRUE))) %>%
      unnest_wider(quantile)
    
    #   sex     mean median range `10%` `20%` `30%` `40%` `50%` `60%` `70%` `80%` `90%` `100%`
    #  <fct>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
    #1 female  42.1   42.8  25.9  35.8  36.7  38.2  40    42.8  45.1  45.7  46.5  47.5   58  
    #2 male    45.9   46.8  25    38.8  40.5  41.3  43.2  46.8  49.0  50.0  50.8  51.9   59.6
    #3 NA      41.3   42    13.2  36.8  37.7  37.8  38.6  42    44    44.5  45.2  46.4   47.3
    

    【讨论】:

    • 太棒了,感谢您的回复。是否可以添加一个额外的观察,将它们全部结合起来。我可以单独执行此操作并添加它,但如果您可以与其他人同时执行此操作,我只是对我自己的知识感到好奇。基本上另一行称为“全部”,因为它与 2 种性别 + NA 有关。
    • 您想要新行中所有观察值的总和吗?您可以在上面的管道中添加janitor::adorn_totals
    • 不是总和,而是没有 group_by(sex) 的平均值、媒体、量化等。鉴于数据先前已分组,我假设我们不能有一个名为“all”的行。该行将使用所有值来查找整个 bill_length_mm 的平均值,而不考虑性别。 @Ronak
    • 我可以通过all_summary &lt;- data.frame( t(c(sex="all", mean = mean(penguins$bill_length_mm, na.rm = TRUE), median = median(penguins$bill_length_mm, na.rm = TRUE), range = diff(range(penguins$bill_length_mm, na.rm = TRUE)), quantile(penguins$bill_length_mm, probs = seq(.1, 1, by = .1), na.rm = TRUE)))) 获取摘要,然后将其与原始帧进行 rbind。这似乎是正确的,但想知道您是否可以在不创建第二个变量的情况下以某种方式做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2016-08-01
    • 2019-10-15
    • 1970-01-01
    • 2018-03-19
    • 2022-10-08
    相关资源
    最近更新 更多