前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tableone?table1?傻傻分不清楚

tableone?table1?傻傻分不清楚

作者头像
医学和生信笔记
发布2022-11-14 17:23:27
8790
发布2022-11-14 17:23:27
举报

Try to learn everything about something!

基线资料表作为临床医学论文中最常见的第一个三线表,几乎是100%必备技能!

一般我们会通过Word和spss结合进行,在Word里面把三线表画好,然后把数据复制粘贴到Word里。

这样做很麻烦,如果数据比较多,要粘贴很久,今天介绍的这个table1可以非常方便快捷的画出基线资料表,大大简化工作方式。

  • 安装
  • 使用
  • 美化
  • 添加P值
  • 和CompareGroups比较

安装

代码语言:javascript
复制
# 2种方式选择1个
install.packages("table1")

require(devtools)
devtools::install_github("benjaminrich/table1")

使用

使用起来也是非常简单,只要1句代码即可,而且是R语言里面的formula形式。

为了方便演示,还是使用之前用过的predimed数据集。

“PREDIMED 是在西班牙进行的一项多中心试验,将具有血管风险,但在参加试验时没有心血管疾病的参与者,随机分配到以下三种饮食中的一种:地中海饮食加特级初榨橄榄油 (MedDiet+VOO), 地中海饮食补充混合坚果(MedDiet+Nuts),或控制饮食(建议减少饮食脂肪)。主要终点是心血管事件(心肌梗死、中风或心血管原因死亡)的发生。

代码语言:javascript
复制
library(table1)
## 
## 载入程辑包:'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
library(compareGroups)
data(predimed)
str(predimed)
## 'data.frame': 6324 obs. of  15 variables:
##  $ group    : Factor w/ 3 levels "Control","MedDiet + Nuts",..: 1 1 3 2 3 1 3 3 1 1 ...
##   ..- attr(*, "label")= chr "Intervention group"
##  $ sex      : Factor w/ 2 levels "Male","Female": 1 1 2 1 2 1 2 1 1 1 ...
##   ..- attr(*, "label")= chr "Sex"
##  $ age      : num  58 77 72 71 79 63 75 66 71 76 ...
##   ..- attr(*, "label")= chr "Age"
##  $ smoke    : Factor w/ 3 levels "Never","Current",..: 3 2 3 3 1 3 1 1 3 2 ...
##   ..- attr(*, "label")= chr "Smoking"
##  $ bmi      : num  33.5 31.1 30.9 27.7 35.9 ...
##   ..- attr(*, "label")= chr "Body mass index"
##  $ waist    : num  122 119 106 118 129 143 88 85 90 79 ...
##   ..- attr(*, "label")= chr "Waist circumference"
##  $ wth      : num  0.753 0.73 0.654 0.694 0.806 ...
##   ..- attr(*, "label")= chr "Waist-to-height ratio"
##  $ htn      : Factor w/ 2 levels "No","Yes": 1 2 1 2 2 2 1 2 2 2 ...
##   ..- attr(*, "label")= chr "Hypertension"
##  $ diab     : Factor w/ 2 levels "No","Yes": 1 2 2 1 1 2 2 2 1 2 ...
##   ..- attr(*, "label")= chr "Type-2 diabetes"
##  $ hyperchol: Factor w/ 2 levels "No","Yes": 2 1 1 2 2 2 2 1 2 1 ...
##   ..- attr(*, "label")= chr "Dyslipidemia"
##  $ famhist  : Factor w/ 2 levels "No","Yes": 1 1 2 1 1 1 1 2 1 1 ...
##   ..- attr(*, "label")= chr "Family history of premature CHD"
##  $ hormo    : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 NA NA 1 1 1 ...
##   ..- attr(*, "label")= chr "Hormone-replacement therapy"
##  $ p14      : num  10 10 8 8 9 9 8 9 14 9 ...
##   ..- attr(*, "label")= chr "MeDiet Adherence score"
##  $ toevent  : num  5.37 6.1 5.95 2.91 4.76 ...
##   ..- attr(*, "label")= chr "follow-up to main event (years)"
##  $ event    : Factor w/ 2 levels "No","Yes": 2 1 1 2 1 2 1 1 2 1 ...
##   ..- attr(*, "label")= Named chr "AMI, stroke, or CV Death"
##   .. ..- attr(*, "names")= chr "varlabel"

大家在使用的时候还是要注意,把分类变量因子化!

代码语言:javascript
复制
table1(~ . | group, data = predimed)

Snipaste_2022-05-11_19-51-49

是不是很简单,把需要分组的变量放在|后面即可。

结果是html形式的,可以直接复制粘贴到Word里面,连续性变量默认给出了两种表现方式!

“但是这个表格还可以继续修改,比如两个治疗组MedDiet+NutsMedDiet+VOD可以放在一个表头下面,Overall可以放在最左边,数值型变量只显示均值±标准差即可。

这也是这个包比较有优势的地方,可以制作复杂表头!

美化

先给大家展示下复杂表头的制作格式,其实非常简单,就是用*即可。

代码语言:javascript
复制
table1(~  . | group*sex, data = predimed,overall = F)

Snipaste_2022-05-11_19-53-38

但是呢,这种情况有时也不是我们需要的,就像上面提出的一样,我们要不同治疗方式在一组的那种表头!

这种情况,就需要先进行一点自定义设置了。

代码语言:javascript
复制
labels <- list(
  
  # 先设置名字
  variables = list(sex="Sex",age="Age(years)",smoke="Smoking",
               bmi="Body mass index",waist="Waist circumference",
               wth="Waist-to-height ratio",htn="Hypertension",
               diab="Type-2 diabetes",hyperchol="Dyslipidemia",
               famhist="Family history of premature CHD",
               p14="MeDiet Adherence score",
               toevent="follow-up to main event (years)",
               event="AMI, stroke, or CV Death"
               ),
  # 设置分组
  groups = list("","","Treatment")
  )

# 因子化分组变量,但predimed数据集已经因子化了,这里不用也可以
levels(predimed$group) <- c("Control","MedDiet + Nuts","MedDiet + VOO")

然后再设置一下分组变量

代码语言:javascript
复制
strata <- c(list(Total=predimed),split(predimed,predimed$group))

然后就能愉快的显示了,是不是很强?

代码语言:javascript
复制
table1(strata, labels, groupspan = c(1,1,2),
       render.continuous=c(.="Mean ± SD") # 设置连续性变量的显示方式
       )

Snipaste_2022-05-11_19-54-28

是不是很好看?基本符合要求了!

但是如果有的数值型变量不符合正态分布怎么办?

可以通过自定义函数解决。

代码语言:javascript
复制
# 自定义你的变量要如何显示
rndr <- function(x, name, ...) {
    if (!is.numeric(x)) return(render.categorical.default(x))
    what <- switch(name,
                   age = "Mean (SD)",
                   bmi = "Mean (SD)",
                   wth = "Mean ± SD",
                   p14 = "Median [IQR]", 
                   toevent  = "Mean ± SD",
                   waist = "Median [Min, Max]"
                   )
    
    parse.abbrev.render.code(c("", what))(x)
}

这样就能愉快的显示了,不过上面那段代码还是太复杂了~

代码语言:javascript
复制
table1(strata, labels, groupspan = c(1,1,2),
       render=rndr
       )

Snipaste_2022-05-11_19-54-44

还有很多自带的样式可以使用,不过默认的三线表还是不用的好。

代码语言:javascript
复制
table1(strata, labels, groupspan = c(1,1,2),
       render=rndr, topclass="Rtable1-zebra"
       )

Snipaste_2022-05-11_19-55-00

添加P值

添加P值可以通过自定义函数解决,这样做的好处是可以自定义使用的方法,不好的一点是太复杂了,小白不友好,不符合简单快捷的原则。

代码语言:javascript
复制
# 构建函数,对不同类型自定义统计方法
pvalue <- function(x, ...) {
    # Construct vectors of data y, and groups (strata) g
    y <- unlist(x)
    g <- factor(rep(1:length(x), times=sapply(x, length)))
    if (is.numeric(y)) {
        # 方差分析
        p <- oneway.test(y ~ g)$p.value
    } else {
        # 分类变量采用卡方检验
        p <- chisq.test(table(y, g))$p.value
    }
    # Format the p-value, using an HTML entity for the less-than sign.
    # The initial empty string places the output on the line below the variable label.
    c("", sub("<", "&lt;", format.pval(p, digits=3, eps=0.001)))
}

但是添加了P值就不能使用自定义的表头了,果然是鱼与熊掌不可兼得啊

代码语言:javascript
复制
table1(~ . | group, data = predimed,
       extra.col=list(`P-value`=pvalue),overall = F,
       render.continuous=c(.="Mean ± SD")
       )

Snipaste_2022-05-11_19-56-44

和CompareGroups比较

CompareGroups不能自定义复杂表头。但是胜在语法简单,自带P值!

“说到这,你知道用哪个包创建三线表了吗?

comparegroups:使用compareGroups包1行代码生成基线资料表

tableone:使用R语言快速绘制三线表

以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发

欢迎在评论区留言或直接添加我的微信!

欢迎关注公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 医学和生信笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用
  • 美化
  • 添加P值
  • 和CompareGroups比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档