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)

