如何用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)))
逻辑说明
- 标记与提取:先标记出需要汇总的
MOO行,同时提取这类行的最后一个group值(即C) - 分组规则:将所有
MOO行归为同一个逻辑分组,统一使用提取到的final_moo_group作为group值;其他行保持原有的group和subgroup组合 - 条件汇总:对
MOO分组执行求和操作,合并为一行;非MOO分组则直接保留所有原始行数据 - 整理输出:移除辅助标记列,按原数据的
group顺序排序,确保结果结构与预期一致
运行上述代码后,得到的结果与result完全匹配。
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

