# A tibble: 400 × 4
分组 时间 方法 value
<fct> <fct> <chr> <dbl>
1 实验组 实验前 方法一 22
2 实验组 实验后 方法一 31
3 对照组 实验前 方法一 51
4 对照组 实验后 方法一 31
5 实验组 实验前 方法二 34
6 实验组 实验后 方法二 25
7 对照组 实验前 方法二 52
8 对照组 实验后 方法二 35
9 实验组 实验前 方法一 32
10 实验组 实验后 方法一 37
# ℹ 390 more rows
R语言绘制三线表
R语言是数据分析和可视化领域的强大工具,今天和大家分享如何使用R语言绘制三线表来汇总统计数据。在线绘图为你提供了基于webr的在线执行R代码的方法,里面包含了本文示例及其他图表模板
示例数据
以下为随机生成的示例数据格式
单表三线表绘制
library(gtsummary)
ttest_statistic <- function(data, variable, by, ...) {
t.test(data[[variable]] ~ as.factor(data[[by]]))$statistic
}
gt1 <- df %>%
filter(方法 == "方法一") %>%
pivot_wider(names_from = 分组, values_from = value) %>%
unnest(cols = c(实验组, 对照组)) %>%
select(时间, 实验组, 对照组) %>%
tbl_summary(
by = 时间,
type = everything() ~ "continuous",
statistic = list(
all_continuous() ~ "{mean} (±{sd})",
all_categorical() ~ "{p}%"
),
missing = "no"
) %>%
add_p() %>%
# add_overall() %>%
add_significance_stars() %>%
add_stat(fns = everything() ~ ttest_statistic) %>%
modify_header(label = "**组别**", add_stat_1 ~ "**t**", p.value = "**p值**")
gt1 %>%
as_flex_table()组别 | 实验前, N = 501 | 实验后, N = 501 | p值2 | t |
|---|---|---|---|---|
实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 |
对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 |
1Mean (±SD) | ||||
2*p<0.05; **p<0.01; ***p<0.001 | ||||
需要注意的是,gtsummary目前不支持直接添加p值对应的统计量,所以这里我们定义了一个函数 ttest_statistic,该函数用于计算两组数据的 t 值,并通过 add_stat 添加到 统计表中。针对不同的tbl_* 函数 add_p支持t.test,chisq.test,aov等不同类型的检验,详细参数可见包说明文件,这里不一一列举。
合并多个表
gtsummary提供了合并多个三线表的方法,支持纵向堆叠与横向合并。
纵向堆叠
gt2 <- df %>%
filter(方法 == "方法二") %>%
pivot_wider(names_from = 分组, values_from = value) %>%
unnest(cols = c(实验组, 对照组)) %>%
select(时间, 实验组, 对照组) %>%
tbl_summary(
by = 时间,
type = everything() ~ "continuous",
statistic = list(
all_continuous() ~ "{mean} (±{sd})",
all_categorical() ~ "{p}%"
),
missing = "no"
) %>%
add_p() %>%
# add_overall() %>%
add_significance_stars() %>%
add_stat(fns = everything() ~ ttest_statistic) %>%
modify_header(label = "**组别**", add_stat_1 ~ "**t**", p.value = "**p值**")
gt <- tbl_stack(
tbls = list(gt1, gt2),
group_header = c("方法一", "方法二")
) %>%
modify_header(
groupname_col = "**评分方法**"
)
gt %>%
modify_header(all_stat_cols() ~ "**{level}**") %>%
as_flex_table()评分方法 | 组别 | 实验前1 | 实验后1 | p值2 | t |
|---|---|---|---|---|---|
方法一 | 实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 |
对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | |
方法二 | 实验组 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
对照组 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 | |
1Mean (±SD) | |||||
2*p<0.05; **p<0.01; ***p<0.001 | |||||
横向堆叠
gt <- tbl_merge(
tbls = list(gt1, gt2),
tab_spanner = c("方法一", "方法二")
)
gt %>%
modify_header(all_stat_cols() ~ "**{level}**") %>%
as_flex_table()
| 方法一 | 方法二 | ||||||
|---|---|---|---|---|---|---|---|---|
组别 | 实验前1 | 实验后1 | p值2 | t | 实验前1 | 实验后1 | p值2 | t |
实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 |
1Mean (±SD) | ||||||||
2*p<0.05; **p<0.01; ***p<0.001 | ||||||||
多类型输出
上面的表格都是基于flextable输出的表格,gtsummary还集成了一些其他格式的输出
huxtable
gt %>% as_hux_table()方法一 | 方法二 | |||||||
|---|---|---|---|---|---|---|---|---|
组别 | 实验前 | 实验后 | p值 | t | 实验前 | 实验后 | p值 | t |
| 实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
| 对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 |
| Mean (±SD) | ||||||||
| *p<0.05; **p<0.01; ***p<0.001 | ||||||||
kable
gt %>% as_kable()| 组别 | 实验前 | 实验后 | p值 | t | 实验前 | 实验后 | p值 | t |
|---|---|---|---|---|---|---|---|---|
| 实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
| 对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 |
kable_extra
gt %>% as_kable_extra()| 组别 | 实验前 | 实验后 | p值 | t | 实验前 | 实验后 | p值 | t |
|---|---|---|---|---|---|---|---|---|
| 实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
| 对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 |
| 1 Mean (±SD) | ||||||||
| 2 *p<0.05; **p<0.01; ***p<0.001 |
tibble
gt %>% as_tibble()# A tibble: 2 × 9
`**组别**` `**实验前**` `**实验后**` `**p值**` `**t**` `**实验前**`
<chr> <chr> <chr> <chr> <chr> <chr>
1 实验组 27 (±6) 41 (±5) <0.001*** -12.0 34 (±3)
2 对照组 50 (±2) 41 (±27) 0.008** 2.24 55 (±4)
# ℹ 3 more variables: `**实验后**` <chr>, `**p值**` <chr>, `**t**` <chr>
gt
gt %>% as_gt()| 组别 | 方法一 | 方法二 | ||||||
|---|---|---|---|---|---|---|---|---|
| 实验前1 | 实验后1 | p值2 | t | 实验前1 | 实验后1 | p值2 | t | |
| 实验组 | 27 (±6) | 41 (±5) | <0.001*** | -12.0 | 34 (±3) | 23 (±7) | <0.001*** | 10.7 |
| 对照组 | 50 (±2) | 41 (±27) | 0.008** | 2.24 | 55 (±4) | 44 (±5) | <0.001*** | 11.9 |
| 1 Mean (±SD) | ||||||||
| 2 *p<0.05; **p<0.01; ***p<0.001 | ||||||||
xlsx
输出到指定的excel也是支持的
gt %>% as_hux_xlsx("./gt.xlsx")

