R数据统计-以表格的形式统计展示

将数据以表格的形式统计展示

gtsummary包使用示例

拿到一批数据时,我们总要先看看数据的基本情况,看看性别,年龄,case, control等这些基本的信息分布,有的时候也要给出相应的P值来说明问题,在R的编程环境中,R包gtsummary就很好的解决了这个需求。下面介绍一下这个包的用法。

1. gtsummary包的安装

#直接安装
install.packages("gtsummary")
# 也可以安装最新的开发板
# remotes::install_github("ddsjoberg/gtsummary")

我安装的时候遇到了一个小的报错,报错提示rlang的版本不够,这个时候最好的办法就是先卸载rlang,然后再安装即可更换到最新版的rlang,解决版本问题

# 卸载rlang
remove.packages("rlang")
# 安装最新版本的rlang
install.packages("rlang")

2. gtsmmary包的使用

gtsummary包使用示例

测试使用的数据集

head(trial)
trt age marker stage grade response death ttdeath
Drug A 23 0.160 T1 II 0 0 24.00
Drug B 9 1.107 T2 I 1 0 24.00
Drug A 31 0.277 T1 II 0 0 24.00
Drug A NA 2.067 T3 III 1 1 17.64
Drug A 51 2.767 T4 III 1 1 16.43
Drug B 39 0.613 T4 I 0 1 15.64

2.1 用法示例1-Summary table

# 使用tbl_summary函数对数据进行汇总
library(gtsummary)
library(tidyverse) #自行安装

# 使用R自带的trail数据集演示
trial %>%
# 选出trial数据集的几列数据统计
select(trt, age, grade, response) %>%
# 表格以trt为分组统计
tbl_summary(by = trt,
# NA值不显示
missing = "no") %>%
# 增加一列P值统计数据
add_p() %>%
# 增加一列trt分组下,每一个分类表型总的样本统计,也就是Overall列
add_overall() %>%
# 加粗分类的标题
bold_labels()

连续性变量(如表格中的age变量)如果不指定统计方式,默认使用中位数(下四分位数,上四分位数)的形式

也可以将连续性变量的统计方式改为常用的mean ± SD的形式

trial %>% 
# 选出trial数据集的几列数据统计
select(trt, age, grade, response) %>%
# 表格以trt为分组统计
tbl_summary(by = trt,
# NA值不显示
missing = "no",
# 改为mean ± SD
list(all_continuous() ~ "{mean} ± ({sd})"),
# 更改label
label = list(age ~ "Participants age", grade ~ "Modified grade")
) %>%
# 增加一列P值统计数据
add_p() %>%
# 增加一列trt分组下,每一个分类表型总的样本统计,也就是Overall列
add_overall() %>%
# 加粗分类的标题
bold_labels() %>%
# 转换为tibble输出
as_gt() # gtsummary格式输出

其他输出方式:

  • as_kable()输出:输出为markdown格式
Characteristic Overall, N = 200 Drug A, N = 98 Drug B, N = 102 p-value
Participants age 47 ± (14) 47 ± (15) 47 ± (14) 0.7
Modified grade 0.9
I 68 (34%) 35 (36%) 33 (32%)
II 68 (34%) 32 (33%) 36 (35%)
III 64 (32%) 31 (32%) 33 (32%)
Tumor Response 61 (32%) 28 (29%) 33 (34%) 0.5
  • as_hux_table()输出: 为huxtable 对象,输出文本字符

    Characteristic Overall, N = 200 Drug A, N = 98 Drug B, N = 102 p-value
    ────────────────────────────────────────────────────────────────────────────────────
    Participants age 47 ± (14) 47 ± (15) 47 ± (14) 0.7
    Modified grade 0.9
    I 68 (34%) 35 (36%) 33 (32%)
    II 68 (34%) 32 (33%) 36 (35%)
    III64 (32%) 31 (32%) 33 (32%)
    Tumor Response 61 (32%) 28 (29%) 33 (34%) 0.5
    ────────────────────────────────────────────────────────────────────────────────────
    Mean ± (SD); n (%)
    Wilcoxon rank sum test; Pearson’s Chi-squared test

Column names: label, stat_0, stat_1, stat_2, p.value

  • as_tibble()输出:

# A tibble: 6 x 5
**Characteristic** **Overall**, N = 200 **Drug A**, N = 98 **Drug B**, N = 102 **p-value**

1 Participants age 47 ± (14) 47 ± (15) 47 ± (14) 0.7
2 Modified grade NA NA NA 0.9
3 I 68 (34%) 35 (36%) 33 (32%) NA
4 II 68 (34%) 32 (33%) 36 (35%) NA
5 III 64 (32%) 31 (32%) 33 (32%) NA
6 Tumor Response 61 (32%) 28 (29%) 33 (34%) 0.5

  • as_flex_table()输出:三线表形式输出

label更改示例

trial %>% 
# 选出trial数据集的几列数据统计
select(trt, age, grade, response) %>%
# 表格以trt为分组统计
tbl_summary(by = trt,
# NA值不显示
missing = "no",
# 改为mean ± SD
list(all_continuous() ~ "{mean} ± ({sd})"),
# 更改label
label = list(age ~ "Participants age", grade ~ "Modified grade")
) %>%
# 增加一列P值统计数据
add_p() %>%
# 增加一列trt分组下,每一个分类表型总的样本统计,也就是Overall列
add_overall() %>%
# 加粗分类的标题
bold_labels() %>%
# 转换为论文中常用的三线表格式
as_flex_table()

tbl_summary函数参数介绍

tbl_summary(
data,
by = NULL,
label = NULL,
statistic = NULL,
digits = NULL,
type = NULL,
value = NULL,
missing = NULL,
missing_text = NULL,
sort = NULL,
percent = NULL,
include = everything(),
group = NULL
)

参数:

  • data: 使用的数据框

  • by: 提供分组统计的列名,可加引号也可以不加引号。

  • label: 使用list指定表格中显示的变量名,
    例如: list(age ~ “changed Age”, stage ~ “Path T Stage”).
    如果没有指定,则使用: attr(data$age, “label”), 这会使列名开头大写. 如果参数指定为:NULL, 则直接使用列名。

  • statistic: 指定每个变量的统计方式。 默认 list(all_continuous() ~ “{median} ({p25}, {p75})”, all_categorical() ~ “{n} ({p}%)”).

  • digits: 指定连续型数据汇总统计的小数点位数的公式列表。 如果没有指定,tbl_summary将给出一个适当数量的小数位数来对统计值进行舍入。 当一个变量显示多个统计信息时,提供一个向量而不是整数。
    例如,若age变量使用均值±SD的方式统计,则digits = list(age ~ c(1, 2))参数表示age的均值保留1为小数,SD保留2为小数。

  • type: 指定变量类型的公式列表。
    接受的值包括 c(“continuous”, “continuous2”, “categorical”, “dichotomous”), 例如 type = list(age ~ “continuous”, female ~ “dichotomous”). 不指定时,则函数自动提供一个合适的统计类型。

  • value: 为二分变量指定要显示的值的公式列表。

  • missing: 指定表中是否包含NA值的计数。
    参数:
    "no" 不显示NA值,
    "ifany" 在分类下另起一行,行名为Unknown,单独统计NA值,仅在变量存在NA值时统计,默认使用ifany参数,
    "always" 在分类下另起一行,行名为Unknown,单独统计NA值,为所有变量都统计NA值,变量没有NA值时,Unknown行统计值为0,

  • missing_text: 设置缺失值(NA)的行名. 默认为Unknown。

  • sort: 指定要对分类数据执行排序的类型的公式列表。可选按频率(frequency)或字母数字降序排序(alphanumeric), 例如按照评率排序:sort = list(everything() ~ “frequency”)

  • percent: 指定返回的百分比类型。 必须是 “column”, “row”, 或者 “cell”. 默认为 “column”.

  • include: 要包含在汇总表中的变量。 默认为 everything()

  • group: 弃用。迁移到 add_p() 添加P值

2.2 用法示例2-Regression Models

使用tbl_regression() 以表格的形式展示回归模型的结果。更加详细的教程参考: tutorial

# 逻辑回归
mod1 <- glm(response ~ trt + age + grade, trial, family = binomial)

# 默认值显示为log(OR),求e^OR次方即为转换的结果
t1 <- tbl_regression(mod1, exponentiate = TRUE)

t1

2.3 用法示例3-并排显示回归模型

使用tbl_merge()函数并排展示多个回归模型的结果

library(survival) 

# 建立生存模型表
t2 <- coxph(Surv(ttdeath, death) ~ trt + grade + age, trial) %>%
tbl_regression(exponentiate = TRUE)

#合并两个表格
tbl_merge_ex1 <-tbl_merge(
tbls = list(t1, t2),
tab_spanner = c("<mark>Tumor Response<mark>", "**Time to Death**")
)
# 其中tab_spanner指定表的列名,支持markdown语法,*斜体*; **粗体**

tbl_merge_ex1

Reference:

http://www.danieldsjoberg.com/gtsummary/