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

如何在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

关键步骤解释

  1. 类型转换:原始数据中id和各value列是字符型,必须转为数值型才能正确执行范围判断和求和计算。
  2. 多范围分组:case_when支持灵活的多条件匹配,直接将分散的id范围映射到同一个分组。
  3. 批量求和: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:23:21