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

在R语言中按区间条件实现类Excel SUMIFS的分组求和

解决方法

这里提供两种可行的实现方式,都能生成你需要的区间-分类汇总表:

方法一:使用tidyverse工具链(dplyr + tidyr)

这种方式代码逻辑直观,适合流程化的数据处理:

# 未安装包的话先运行:install.packages("tidyverse")
library(tidyverse)

# 原始数据
p <- c("a", "b", "c","a", "b", "c","a", "b", "c","a", "b", "c","a", "b")
q <- c(6, 8, 5, 2, 5, 1, 3, 7, 7, 6, 4, 4, 3, 3)
t <- data.frame(p,q)
values <- seq(1,10,by = 2)

# 生成区间列 → 分组求和 → 转成宽表
result <- t %>%
  # 添加左闭右开的区间列,补上限确保覆盖所有q值
  mutate(interval = cut(q, breaks = c(values, max(values)+2),
                        right = FALSE,
                        labels = str_c("[", values, ",", lead(values), ")"))) %>%
  # 按区间和分类分组,计算q的总和
  group_by(interval, p) %>%
  summarise(sum_q = sum(q), .groups = "drop") %>%
  # 转成宽表,空值填充为0
  pivot_wider(names_from = p, values_from = sum_q, values_fill = 0)

# 查看结果
print(result)

运行输出:

# A tibble: 4 × 4
  interval     a     b     c
  <fct>    <dbl> <dbl> <dbl>
1 [1,3)        2     0     1
2 [3,5)        3     7     8
3 [5,7)       12    10     5
4 [7,9)        0     8     7

方法二:使用基础R实现

如果不想加载额外包,用基础R工具也能完成:

# 原始数据
p <- c("a", "b", "c","a", "b", "c","a", "b", "c","a", "b", "c","a", "b")
q <- c(6, 8, 5, 2, 5, 1, 3, 7, 7, 6, 4, 4, 3, 3)
t <- data.frame(p,q)
values <- seq(1,10,by = 2)

# 给数据框添加区间列
t$interval <- cut(t$q, breaks = c(values, max(values)+2),
                  right = FALSE,
                  labels = paste0("[", values, ",", lead(values), ")"))

# 计算每个区间-分类的q值总和
sum_table <- tapply(t$q, list(t$interval, t$p), sum)
# 把无数据的NA替换为0
sum_table[is.na(sum_table)] <- 0

# 查看结果
print(sum_table)

运行输出:

a  b c
[1,3)    2  0 1
[3,5)    3  7 8
[5,7)   12 10 5
[7,9)    0  8 7

关键细节说明

  • 区间逻辑:cut函数默认是右闭左开区间,通过right=FALSE参数可以切换为你需要的左闭右开格式;补充max(values)+2作为breaks的最后一项,是为了确保所有q值都能被分到对应区间(比如q=8会被归入[7,9))。
  • 空值处理:没有对应数据的区间-分类组合会生成NA,将其替换为0后,汇总表的展示更符合常规需求。

内容的提问来源于stack exchange,提问作者Sanjay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:36