用 R 中的平均值、中位数、范围和数量进行总结
Posted
技术标签:
【中文标题】用 R 中的平均值、中位数、范围和数量进行总结【英文标题】:summarise with mean, median, range and quants in 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'))))
【问题讨论】:
【参考方案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 <- 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。这似乎是正确的,但想知道您是否可以在不创建第二个变量的情况下以某种方式做到这一点。以上是关于用 R 中的平均值、中位数、范围和数量进行总结的主要内容,如果未能解决你的问题,请参考以下文章
R语言统计函数:均值meanmedian中位数sd标准差var方差mad中位数绝对偏差quantile分位数range范围(起始值结束值)sum加和diff数据差分scale标准化
R语言统计函数:均值meanmedian中位数sd标准差var方差mad中位数绝对偏差quantile分位数range范围(起始值结束值)sum加和diff数据差分scale标准化
R语言vtreat包自动处理dataframe的缺失值使用分组的中位数来标准化数据列中每个数据的值(和中位数表连接并基于中位数进行数据标化)计算数据列的中位数或者均值并进行数据标准化