R语言中如何将数据分组至指定区间并计算分组均值?
问题分析与解决方案
核心问题拆解
Function 1 区间划分错误
你用seq(min(A), max(A), by=999)生成的区间起始点是A列的最小值(200),步长999,导致每个区间仅能容纳单个数据点,所以输出的new_range都是类似(699,700]的窄区间,完全不符合你要的0 - 999.99这类固定宽度区间的需求。Function 2 管道逻辑错误
在mutate内部对cut返回的因子向量直接调用group_by,但group_by只能作用于数据框,因此触发no applicable method for 'group_by' applied to an object of class "factor"错误。正确逻辑应该是先给数据框添加区间列,再基于该列分组聚合。
修正后的完整代码
步骤1:定义正确的区间并生成分组列
首先要从0开始构建固定宽度的区间,同时自定义区间显示格式,匹配你期望的Ranges列样式:
library(readxl) library(dplyr) # 读取数据(替换为你的文件路径) A1 <- read_excel("file") DataRange <- data.frame(A = A1$C, B = A1$R) # 生成从0开始、步长1000的区间断点,覆盖所有A列数据 max_A <- ceiling(max(DataRange$A, na.rm = TRUE) / 1000) * 1000 breaks <- seq(0, max_A, by = 1000) # 自定义区间标签,格式为"起始值 - 结束值.99" labels <- paste0(breaks[-length(breaks)], " - ", breaks[-1] - 0.01) # 添加区间列并计算分组平均值 result <- DataRange %>% mutate(Ranges = cut(A, breaks = breaks, labels = labels, include.lowest = TRUE)) %>% group_by(Ranges) %>% summarize(Average = mean(B, na.rm = TRUE)) %>% # 可选:将平均值转为百分比格式(匹配你期望的结果) mutate(Average = paste0(round(Average, 0), "%")) %>% as.data.frame() print(result)
步骤2:测试示例数据的输出
用你提供的原始数据集测试,运行上述代码会得到类似以下结果:
Ranges Average 1 0 - 999.99 28% 2 1000 - 1999.99 67% 3 3000 - 3999.99 30% 4 7000 - 7999.99 12% 5 14000 - 14999.99 56% 6 17000 - 17999.99 30%
关键参数解释
breaks = seq(0, max_A, by = 1000):从0开始,每1000为一个区间断点,确保覆盖所有数据。labels = paste0(...):自定义区间显示文本,替换cut默认的(a,b]格式。include.lowest = TRUE:确保最小值(如200)被包含在第一个区间内。na.rm = TRUE:计算平均值时忽略缺失值,避免报错。
内容的提问来源于stack exchange,提问作者EBLou
相关产品推荐
相关产品推荐

