Welcome to R Square

gt 包生成表格代码示例

楚新元 / 2026-05-11


gt 包相当于表格界的 ggplot2,之前学了很多做表的包,要么语法不够优雅自然,要么功能不够强大,现在我只需要 gt 包就够了,尽管日常使用中我们的表格没有这个复杂,但是 gt 包真的把表格的各种要素全都考虑进来了,不用再学一堆包了,另外 gt 包的语法也更统一更简洁。对于国内大量使用 Word 文档的场景,再学习下 flextable 包就基本差不了。

先来重新认识下表的构成要素:

下面是一个学习 gt 包核心功能的代码示例:

# 加载必要的 R 包
library(dplyr)
library(gt)

# 准备数据
mtcars |> 
  tibble::rownames_to_column("model") |> 
  select(
    model, cyl, disp, 
    hp, mpg, wt, qsec
  ) |> 
  head(10) |> 
  mutate(
    hp1 = hp
    cyl = paste(cyl, "缸")
  ) -> df

# 创建 gt 表格,并进行丰富的格式化和样式调整
df |> 
  gt(groupname_col = "cyl") |> 
  
  # 1. 表格标题 & 副标题
  tab_header(
    title = md("**gt 包功能全面展示**"),
    subtitle = md("基于 *mtcars* 数据(前 10 车型)")
  ) |> 
  
  # 2. 来源注释 & 脚注
  tab_source_note(
    source_note = "数据来源:1974 年《Motor Trend》杂志"
  ) |> 
  tab_footnote(
    footnote = "马力(净功率)",
    locations = cells_column_labels(columns = hp)
  ) |> 
  tab_footnote(
    footnote = "油耗(英里/加仑)大于 20 的车型",
    locations = cells_body(
      columns = mpg, 
      rows = mpg > 20
    )
  ) |> 
  
  # 3. 列标签重命名(支持 Markdown/HTML)
  cols_label(
    model = md("**车型**"),
    disp = md("排量(立方英寸)"),
    hp = html("马力 <i>(hp)</i>"),
    mpg = "油耗 (mpg)",
    wt = "重量 (1000 lbs)",
    qsec = "1/4英里时间"
  ) |> 
  
  # 4. 列组(Spanners)
  tab_spanner(
    label = "动力性能",
    columns = c(disp, hp)
  ) |> 
  tab_spanner(
    label = "经济性与操控",
    columns = c(mpg, wt, qsec)
  ) |> 
  
  # 5. 数值列的格式化(小数、千分位、货币等)
  fmt_number(
    columns = c(disp, hp, mpg),
    decimals = 1,
    use_seps = TRUE
  ) |> 
  fmt_number(
    columns = wt,
    decimals = 2,
    pattern = "{x} t"
  ) |> 
  fmt_number(
    columns = qsec,
    decimals = 2,
    suffixing = TRUE
  ) |> 
  
  # 6. 条件格式 - 根据数值改变单元格颜色(使用 data_color)
  data_color(
    columns = hp,
    method = "numeric",
    palette = c("white", "red"),
    domain = c(50, 250)
  ) |> 
  data_color(
    columns = mpg,
    method = "numeric",
    palette = "viridis",
    reverse = TRUE
  ) |> 
  
  # 7. 自定义单元格样式(加粗、背景色等)
  tab_style(
    style = list(
      cell_fill(color = "lightyellow"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      columns = model,
      rows = model == "Mazda RX4"
    )
  ) |>
  tab_style(
    style = cell_text(
      style = "italic", 
      color = "blue"
    ),
    locations = cells_body(
      columns = qsec,
      rows = qsec < 17
    )
  ) |> 
  
  # 8. 合并/突出显示特定行的某个单元格
  tab_style(
    style = cell_text(
      weight = "bold", 
      size = "larger"
    ),
    locations = cells_row_groups(groups = "6 缸")
  ) |> 
  
  # 9. 添加条形图(示例:在马力列中添加水平条形图)
  cols_nanoplot(
    columns = hp1, 
    new_col_name = "nanoplots",
    new_col_label = md("**马力 (hp)**"),
    after = "qsec",
    plot_type = "bar"
  ) |> 
  cols_align(
    align = "center", 
    columns = nanoplots
  ) |> 
  
  # 10. 调整行/列边框、整体外观
  tab_options(
    table.font.size = "small",
    table.background.color = "#F8F8F8",
    column_labels.background.color = "#D3D3D3",
    row_group.background.color = "#E0E0E0",
    heading.background.color = "#F2F2F2",
    footnotes.background.color = "#F9F9F9",
    source_notes.background.color = "#F9F9F9",
    table.border.top.style = "solid",
    table.border.top.width = 2
  ) |> 
  
  # 11. 快速运用内置样式(可选),会覆盖部分自定义颜色
  opt_stylize(style = 6, color = "blue") |> 
  
  # 12. 添加行组标签的说明(可选)
  tab_row_group(
    label = md("**四缸车型**"),
    rows = which(df$cyl == "4 缸")
  ) |> 
  tab_row_group(
    label = md("**六缸车型**"),
    rows = which(df$cyl == "6 缸")
  ) |> 
  tab_row_group(
    label = md("**八缸车型**"),
    rows = which(df$cyl == "8 缸")
  ) |> 
  
  # 13. 添加分组汇总行(示例:计算每个缸数组的平均马力和油耗)
  # summary_rows(
  #   groups = everything(),
  #   columns = mpg,
  #   fns = list(
  #     average = "mean",
  #     total = "sum",
  #     SD = "sd"
  #   )
  # ) |> 

  # 14. 最后调整列宽(以像素为单位)
  cols_width(
    model ~ px(150),
    disp ~ px(120),
    hp ~ px(90),
    mpg ~ px(90),
    nanoplots ~ px(150),
    everything() ~ px(100)
  ) -> gt_table

# 打印表格
print(gt_table)