如何在R中计算分组区间数据的近似均值、中位数与众数
R实现分组数据的构造与描述统计计算
1. 构造结构化数据框
首先将分组区间和频数存入数据框,同时拆分区间得到每组上下限、计算组中值,为后续统计计算做准备:
# 存入原始数据 df <- data.frame( value = c("1-6", "7-16", "17-21", "22-51", "52-80", "81-110"), frequency = c(300, 400, 300, 1200, 800, 55) ) # 拆分区间得到每组上下限 df$lower <- as.numeric(sapply(strsplit(df$value, "-"), "[", 1)) df$upper <- as.numeric(sapply(strsplit(df$value, "-"), "[", 2)) # 计算组中值 df$mid <- (df$lower + df$upper)/2
2. 计算近似均值
分组数据的均值用组中值代表每组的平均水平,按频数加权计算:
total_n <- sum(df$frequency) approx_mean <- sum(df$mid * df$frequency) / total_n # 计算结果约为37.05
3. 计算近似中位数
中位数计算公式为:中位数 = 中位数组下限 + ((总频数/2 - 中位数组前累积频数)/中位数组频数) * 组距
# 计算累积频数 df$cum_freq <- cumsum(df$frequency) # 定位中位数所在组(累积频数首次超过总频数一半的组) median_group_idx <- which(df$cum_freq >= total_n/2)[1] L <- df$lower[median_group_idx] pre_cum_freq <- df$cum_freq[median_group_idx - 1] median_group_freq <- df$frequency[median_group_idx] group_width <- df$upper[median_group_idx] - df$lower[median_group_idx] approx_median <- L + ((total_n/2 - pre_cum_freq) / median_group_freq) * group_width # 计算结果约为35.19
4. 计算近似众数
众数计算公式为:众数 = 众数组下限 + (众数组与前一组频数差/(众数组与前一组频数差 + 众数组与后一组频数差)) * 组距
# 定位频数最高的众数组 mode_group_idx <- which.max(df$frequency) L <- df$lower[mode_group_idx] delta1 <- df$frequency[mode_group_idx] - df$frequency[mode_group_idx - 1] delta2 <- df$frequency[mode_group_idx] - df$frequency[mode_group_idx + 1] group_width <- df$upper[mode_group_idx] - df$lower[mode_group_idx] approx_mode <- L + (delta1/(delta1 + delta2)) * group_width # 计算结果约为42.77
内容的提问来源于stack exchange,提问作者phen
相关产品推荐
相关产品推荐

