r - 有没有一种方法可以找到在 R 上按区间分组的数据的近似平均值、中位数和众数?
问题描述
我有 2 列值和频率。值 1-6, 7-16, 17-21, 22-51, 52-80,81-110 频率 300,400,300,1200,800,55
我将如何构建一个数据框并使用函数来近似平均值、中位数和众数数据?
解决方案
这是使用模拟的一种可能方法。您可以创建具有所需间隔频率的假数据并查看结果。
在这里,我假设区间范围内的每个值都是均匀可能的,但实际上您可能拥有有助于指导每个区间更现实分布的领域知识。例如,如果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 中并不简单:如何找到统计模式?
推荐阅读
- c# - 嵌套对象未与服务器端模型映射
- python - Pandas DataFrame 匹配 URL 中的单词
- c++ - c++ 中的继承和“is-a”关系
- forth - 第四:如何创建一个单词来编译其他单词直到找到某个分隔符?
- javascript - 基于 routerLinkActive 的 Angular 高亮
- syntax - 在 F# 中以无点样式匹配?
- node.js - 如何获取用户位置和他/她的目的地点之间的距离(以公里为单位)
- angular - Angular 8:等待订阅响应
- python - 如何从 python API azure sdk 获取 Azure 规模集实例的公共 IP?
- ios - 字典中的 NSKeyedArchiver nil 值