在R语言中如何用dplyr/tidyr快速为指定组求和并新增汇总行?
用dplyr实现简洁的汇总行添加
直接用dplyr的管道语法结合bind_rows+summarise(across(...))就能一步完成需求,不需要拆分多步骤操作。
示例数据
先构造一个符合需求的示例数据框:
library(dplyr) df <- tibble( Name = c("Justin - A", "Justin - B", "Sarah - A", "Mike - X"), Value1 = c(10, 20, 15, 5), Value2 = c(3, 7, 4, 2) )
核心实现代码
df %>% bind_rows( filter(., grepl("^Justin -", Name)) %>% summarise( Name = "Justin - All", across(where(is.numeric), sum) ) )
代码说明
filter(., grepl("^Justin -", Name)):从原始数据中筛选出名称以Justin -开头的行,管道里的.代表上游传入的原始数据框summarise(...):生成汇总行:- 手动指定
Name为目标名称Justin - All across(where(is.numeric), sum):自动识别所有数值型列并求和,不用硬编码列名,能适配不同数量的数值列
- 手动指定
bind_rows():将原始数据和生成的汇总行合并,保留全部原始数据的同时新增汇总行
最终输出结果
# A tibble: 5 × 3 Name Value1 Value2 <chr> <dbl> <dbl> 1 Justin - A 10 3 2 Justin - B 20 7 3 Sarah - A 15 4 4 Mike - X 5 2 5 Justin - All 30 10
扩展处理:包含其他非数值列的情况
如果数据框还有其他非数值列(比如分类列),可以在summarise里手动指定这些列的取值(比如填Total或空值NA):
df <- tibble( Name = c("Justin - A", "Justin - B", "Sarah - A", "Mike - X"), Category = c("Group1", "Group1", "Group2", "Group3"), Value1 = c(10, 20, 15, 5), Value2 = c(3, 7, 4, 2) ) df %>% bind_rows( filter(., grepl("^Justin -", Name)) %>% summarise( Name = "Justin - All", Category = "Total", # 也可以写 NA_character_ 表示空值 across(where(is.numeric), sum) ) )
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

