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

使用dplyr聚合时保留指定列的问题求助(R语言)

解决R中分组聚合时保留对应列的问题

我懂你的需求啦——分组后既要算出c的最大值和总和,还要保留c取最大值时对应的b值;如果同一组里有多个相同的最大c,就得挑b更大的那个。之前用summarise只拿到聚合结果却丢了对应b的问题,咱们用dplyr就能轻松解决,试试下面的方法:

方法一:用slice_max精准筛选目标行

先看你的原始数据:

df <- data.frame(a=rep(c("a","b"),each=2),b=c(500,400,200,300), c = c(5,10,2,4),stringsAsFactors = FALSE)

直接运行这段代码就能得到想要的结果:

library(dplyr)

df %>%
  group_by(a) %>%
  # 先计算每组c的总和,新增sum_c列
  mutate(sum_c = sum(c)) %>%
  # 按c降序、b降序排序,取每组第一行(满足c最大,c相同则b最大)
  slice_max(order_by = c(c, b), n = 1) %>%
  # 重命名列名让结果更清晰
  rename(max_c = c) %>%
  # 调整列的顺序
  select(a, max_c, sum_c, b) %>%
  ungroup()

运行后得到的结果:

# A tibble: 2 × 4
  a     max_c sum_c     b
  <chr> <dbl> <dbl> <dbl>
1 a        10    15   400
2 b         4     6   300

测试特殊场景

针对你提到的c值相同的情况,比如这个测试数据:

df_special <- data.frame(a = rep("a",2), b = c(500,400), c = c(5,5), stringsAsFactors = FALSE)

用同样的代码处理,就能得到b=500的预期结果:

# A tibble: 1 × 4
  a     max_c sum_c     b
  <chr> <dbl> <dbl> <dbl>
1 a         5    10   500

方法二:用arrange+slice实现

如果你更习惯排序后取行的思路,也可以这么写:

df %>%
  group_by(a) %>%
  mutate(sum_c = sum(c)) %>%
  # 组内先按c降序,再按b降序排列
  arrange(desc(c), desc(b), .by_group = TRUE) %>%
  # 取每组的第一行
  slice(1) %>%
  rename(max_c = c) %>%
  select(a, max_c, sum_c, b) %>%
  ungroup()

这个方法和slice_max的效果完全一致,只是用排序+取首行的逻辑实现,看你个人习惯选择就行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:33:14