如何在R语言中对DataFrame按同一列多范围分组并汇总多列
多范围分组汇总的R语言实现方案
原始数据
生成初始DataFrame的代码:
id <- c("1","1", "1","2","2","2","3","3","3","4","4","4","5","5","5","6","6","6") value <- c("1", "2", "3", "4", "5", "6", "7", "8","9","10","11","12","13","14","15","16","17","18") value2 <- c("1", "2", "3", "4", "5", "6", "7", "8","9","10","11","12","13","14","15","16","17","18") value3 <- c("1", "2", "3", "4", "5", "6", "7", "8","9","10","11","12","13","14","15","16","17","18") df <- data.frame(id, value, value2, value3)
需求说明
将数据按指定多范围分组:
- newname1:id属于1-2、5-6的行
- newname2:id属于3-4的行
并对value、value2、value3列分别求和,得到目标汇总结果。
解决方案
核心思路是用dplyr::case_when自定义分组规则,结合across批量处理多列求和,完整实现代码如下:
library(dplyr) # 转换数据类型:id转数值用于范围判断,value类列转数值用于求和 df_processed <- df %>% mutate( id = as.numeric(id), across(starts_with("value"), as.numeric) ) %>% # 自定义多范围分组规则 mutate(newname = case_when( id %in% c(1:2, 5:6) ~ "newname1", id %in% 3:4 ~ "newname2", TRUE ~ "other" # 可选:处理不在指定范围内的异常id )) %>% # 按新分组汇总,批量对所有value开头的列求和 group_by(newname) %>% summarize( across(starts_with("value"), sum, .names = "sum{col}") ) %>% ungroup() %>% as.data.frame() df_processed
关键步骤解释
- 类型转换:原始数据中
id和各value列是字符型,必须转为数值型才能正确执行范围判断和求和计算。 - 多范围分组:
case_when支持灵活的多条件匹配,直接将分散的id范围映射到同一个分组。 - 批量求和:
across(starts_with("value"), sum)自动匹配所有以value开头的列,统一执行求和操作,.names参数用于设置汇总列的命名格式。
结果验证
运行代码后得到的结果与目标df2完全一致:
newname sumvalue sumvalue2 sumvalue3 1 newname1 114 114 114 2 newname2 57 57 57
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

