在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
相关产品推荐
相关产品推荐

