如何在R的DataFrame中智能添加按科目分组的小计行
高效添加分组小计行的R实现方法
针对你需要为每个SUBJECT添加"All Grades"小计行的需求,以下是两种更高效的实现方式,无需手动逐个字段编写求和逻辑:
方法一:使用dplyr的group_modify + across批量处理
利用dplyr的across函数批量对数值列求和,结合group_modify遍历每个分组,自动生成小计行并与原数据合并:
library(dplyr) df2 <- df %>% group_by(SUBJECT) %>% group_modify(~ bind_rows( # 生成当前分组的小计行:Level设为"All Grades",数值列求和 summarize(., Level = "All Grades", across(c(Total, starts_with("Class")), sum)), # 拼接原分组的所有行 .x )) %>% ungroup()
优势:
- 无需手动指定每个
Class*列,starts_with("Class")会匹配所有以Class开头的列,新增同类列时无需修改代码 - 逻辑清晰,通过
group_modify统一处理每个分组的小计生成与拼接
方法二:使用janitor包快速添加小计行
janitor包的adorn_totals函数专门用于生成总计/小计行,代码更简洁:
# 若未安装janitor包,先执行:install.packages("janitor") library(janitor) library(dplyr) df2 <- df %>% group_by(SUBJECT) %>% # 为每个分组添加行小计,指定小计行名称为"All Grades",填充非数值列 adorn_totals("row", name = "All Grades", fill = "All Grades") %>% ungroup() %>% # 将小计行调整到每个分组的最前面 arrange(SUBJECT, desc(Level == "All Grades"))
优势:
- 代码量极少,
adorn_totals自动识别数值列并求和 - 内置填充非数值列的功能,无需额外处理
Level字段
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

