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

如何用dplyr单管道折叠DataFrame特定行并保留其他行信息

单个dplyr管道完成特定行汇总与保留其他行细节

我有一个DataFrame,想要用单个dplyr管道链完成以下操作:

  • 对subgroup等于MOO的行,将x、y列求和汇总,并且保留这类行的最后一个group值(即C)
  • 保留DataFrame中其他行的原有细节

目前我能通过筛选目标行、汇总后合并的方式实现,但想知道能不能在单个dplyr管道里完成。

示例数据

df <- data.frame(
  group = c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
  subgroup = c("BOO","BOO","BOO","BOO","FOO","FOO","FOO","FOO","MOO","MOO","MOO","MOO","ZOO","ZOO","ZOO","ZOO","KOO","KOO","KOO","KOO"),
  x = c(8,12,26,4,13,14,21,16,1,30,24,10,20,9,7,23,19,28,29,25),
  y = c(24,22,23,26,11,1,19,10,21,13,27,20,7,9,17,5,18,6,30,25)
)

期望结果

result <- data.frame(
  group = c("A","A","A","A","A","B","B","B","C","C","C","C","D","D","D","D","D"),
  subgroup = c("BOO","BOO","BOO","BOO","FOO","FOO","FOO","FOO","MOO","ZOO","ZOO","ZOO","ZOO","KOO","KOO","KOO","KOO"),
  x = c(8,12,26,4,13,14,21,16,65,20,9,7,23,19,28,29,25),
  y = c(24,22,23,26,11,1,19,10,81,7,9,17,5,18,6,30,25)
)

解决方案

可以通过dplyr的分组、条件判断与汇总组合,在单个管道内完成需求:

library(dplyr)

df %>%
  # 标记MOO行,同时提取MOO行的最后一个group值
  mutate(
    is_moo = subgroup == "MOO",
    final_moo_group = last(group[is_moo])
  ) %>%
  # 分组:MOO行统一归为一组,其他行保留原group+subgroup分组
  group_by(
    group = if_else(is_moo, final_moo_group, group),
    subgroup = if_else(is_moo, "MOO", subgroup),
    is_moo
  ) %>%
  # 汇总逻辑:MOO行求和合并为一行,其他行保留所有原始数据
  summarise(
    x = if (first(is_moo)) sum(x) else x,
    y = if (first(is_moo)) sum(y) else y,
    .groups = "drop"
  ) %>%
  # 移除辅助列,按原数据的group顺序排序
  select(-is_moo) %>%
  arrange(match(group, unique(df$group)))

逻辑说明

  1. 标记与提取:先标记出需要汇总的MOO行,同时提取这类行的最后一个group值(即C)
  2. 分组规则:将所有MOO行归为同一个逻辑分组,统一使用提取到的final_moo_group作为group值;其他行保持原有的group和subgroup组合
  3. 条件汇总:对MOO分组执行求和操作,合并为一行;非MOO分组则直接保留所有原始行数据
  4. 整理输出:移除辅助标记列,按原数据的group顺序排序,确保结果结构与预期一致

运行上述代码后,得到的结果与result完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:07:07