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

如何使用gt按分组(年份)添加分组总计?

按年份分组添加总计的解决方案

问题描述

我有一段可复现的R代码,想按年份分组添加总计行。目前我能用janitor包的adorn_totals()添加全局总计,但不知道怎么给2012、2013每个年份单独加分组总计,求指点,谢谢。

原始数据与代码

library(dplyr)
library(tidyr)
library(janitor)
library(gt)

a <- structure(list(SampleDate = structure(c(15710, 15713, 15713, 
15710, 15710, 15713, 15713, 15710, 15708, 15713, 15712, 15708, 
15708, 15713, 15712, 15708), class = "Date"), year = c("2012", 
"2013", "2013", "2012", "2013", "2013", "2013", "2013", "2013", 
"2012", "2013", "2013", "2013", "2013", "2013", "2013"), F = c(0, 
1, 0, 0, 0, 1, 0, 0, 0, 22, 0, 0, 0, 65, 0, 0), W = c(0, 0, 1, 
0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0), S = c(0, 0, 0, 0, 1, 
0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0), LF = c(1, 0, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 1, 0, 0, 1)), class = "data.frame", row.names = c(NA, 
-16L))

# 原始处理代码(仅添加全局总计)
a %>% 
  group_by(year,SampleDate) %>% 
  summarise(W = sum(W), F = sum(F), LF = sum(LF), S = sum(S)) %>% 
  adorn_totals() %>% 
  gt(groupname_col = "year") %>% 
  tab_header(title = md("Fish Observations"), subtitle = md("Total number of fish by year"))

解决方案1:用dplyr+janitor生成带分组总计的数据框

通过group_modify()对每个年份分组单独应用adorn_totals(),生成包含分组总计行的数据框,后续可灵活用于各种输出:

a_processed <- a %>%
  # 按年份和日期聚合
  group_by(year, SampleDate) %>%
  summarise(W = sum(W), F = sum(F), LF = sum(LF), S = sum(S), .groups = "drop_last") %>%
  # 对每个年份分组添加总计行
  group_modify(~ adorn_totals(.x, where = "row", name = "年度总计")) %>%
  ungroup()

# 生成gt表格
a_processed %>%
  gt(groupname_col = "year") %>%
  tab_header(title = md("鱼类观测数据"), subtitle = md("按年份统计的鱼类总数"))

解决方案2:直接在gt表格中添加分组总计

如果只需要可视化输出,gt包的summary_rows()可以直接在表格层面为每个分组添加总计,无需修改原始聚合后的数据框:

a %>%
  group_by(year, SampleDate) %>%
  summarise(W = sum(W), F = sum(F), LF = sum(LF), S = sum(S)) %>%
  gt(groupname_col = "year") %>%
  tab_header(title = md("鱼类观测数据"), subtitle = md("按年份统计的鱼类总数")) %>%
  # 为每个年份分组添加总计行
  summary_rows(
    groups = TRUE,  # 针对每个分组生效
    fns = list(总计 = ~sum(.)),  # 求和函数
    formatter = fmt_number,  # 格式化数字
    decimals = 0  # 保留0位小数
  )

两种方法都能实现按年份添加分组总计的需求,你可以根据后续是否需要复用数据框来选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:36:02