You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中如何将数据分组至指定区间并计算分组均值?

问题分析与解决方案

核心问题拆解

  1. Function 1 区间划分错误
    你用seq(min(A), max(A), by=999)生成的区间起始点是A列的最小值(200),步长999,导致每个区间仅能容纳单个数据点,所以输出的new_range都是类似(699,700]的窄区间,完全不符合你要的0 - 999.99这类固定宽度区间的需求。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:36:16