首页 > 解决方案 > 有没有一种方法可以找到在 R 上按区间分组的数据的近似平均值、中位数和众数?

问题描述

我有 2 列值和频率。值 1-6, 7-16, 17-21, 22-51, 52-80,81-110 频率 300,400,300,1200,800,55

我将如何构建一个数据框并使用函数来近似平均值、中位数和众数数据?

标签: rdataframestatistics

解决方案


这是使用模拟的一种可能方法。您可以创建具有所需间隔频率的假数据并查看结果。

在这里,我假设区间范围内的每个值都是均匀可能的,但实际上您可能拥有有助于指导每个区间更现实分布的领域知识。例如,如果value代表年龄,那么我们应该期望“81”比“110”更有可能,即使两者处于相同的区间。在这种情况下,您可以将runif下面的步骤替换为sample并在其中指定不同值的概率。但作为一种快速的粗略介绍,这种方法应该可以让你大部分时间到达那里。

首先,您的摘要信息作为代码:

df <- data.frame(value = c("1-6", "7-16", "17-21", "22-51", "52-80","81-110"),
           freq = c(300,400,300,1200,800,55))

然后我们可以创建适合您的汇总数字的数据:

library(dplyr); library(tidyr)
set.seed(0)
df %>% 
  separate(value, c("min", "max"), remove = FALSE, convert = TRUE) %>%
  uncount(freq) %>%
  rowwise() %>%
  mutate(value_random = runif(1, min, max)) %>%
  ungroup()

 #  value   min   max value_random
 #  <chr> <int> <int>        <dbl>
 #1 1-6       1     6         4.90
 #2 1-6       1     6         3.62
 #3 1-6       1     6         2.23
 #4 1-6       1     6         3.67
 #...

然后你可以得到你正在寻找的摘要统计信息......

... %>% summarize(mean = mean(value_random),
                  median = median(value_random))

# output, will vary depending on the random seed set with "set.seed" above
   mean median
  <dbl>  <dbl>
1  36.8   33.9

有关计算模式的方法,请参见此处 - 在基础 R 中并不简单:如何找到统计模式?


推荐阅读