tableone?table1?傻傻分不清楚
Try to learn everything about something!
基线资料表作为临床医学论文中最常见的第一个三线表,几乎是100%必备技能!
一般我们会通过Word和spss结合进行,在Word里面把三线表画好,然后把数据复制粘贴到Word里。
这样做很麻烦,如果数据比较多,要粘贴很久,今天介绍的这个table1
可以非常方便快捷的画出基线资料表,大大简化工作方式。
安装
使用
美化
添加P值
和CompareGroups比较
安装
# 2种方式选择1个
install.packages("table1")
require(devtools)
devtools::install_github("benjaminrich/table1")
使用
使用起来也是非常简单,只要1句代码即可,而且是R语言里面的formula形式。
为了方便演示,还是使用之前用过的predimed
数据集。
“PREDIMED 是在西班牙进行的一项多中心试验,将具有血管风险,但在参加试验时没有心血管疾病的参与者,随机分配到以下三种饮食中的一种:地中海饮食加特级初榨橄榄油 (MedDiet+VOO), 地中海饮食补充混合坚果(MedDiet+Nuts),或控制饮食(建议减少饮食脂肪)。主要终点是心血管事件(心肌梗死、中风或心血管原因死亡)的发生。
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"
大家在使用的时候还是要注意,把分类变量因子化!
table1(~ . | group, data = predimed)
是不是很简单,把需要分组的变量放在|
后面即可。
结果是html
形式的,可以直接复制粘贴到Word里面,连续性变量默认给出了两种表现方式!
“但是这个表格还可以继续修改,比如两个治疗组MedDiet+Nuts和MedDiet+VOD可以放在一个表头下面,Overall可以放在最左边,数值型变量只显示均值±标准差即可。
这也是这个包比较有优势的地方,可以制作复杂表头!
美化
先给大家展示下复杂表头的制作格式,其实非常简单,就是用*
即可。
table1(~ . | group*sex, data = predimed,overall = F)
但是呢,这种情况有时也不是我们需要的,就像上面提出的一样,我们要不同治疗方式在一组的那种表头!
这种情况,就需要先进行一点自定义设置了。
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")
然后再设置一下分组变量:
strata <- c(list(Total=predimed),split(predimed,predimed$group))
然后就能愉快的显示了,是不是很强?
table1(strata, labels, groupspan = c(1,1,2),
render.continuous=c(.="Mean ± SD") # 设置连续性变量的显示方式
)
是不是很好看?基本符合要求了!
但是如果有的数值型变量不符合正态分布怎么办?
可以通过自定义函数解决。
# 自定义你的变量要如何显示
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)
}
这样就能愉快的显示了,不过上面那段代码还是太复杂了~
table1(strata, labels, groupspan = c(1,1,2),
render=rndr
)
还有很多自带的样式可以使用,不过默认的三线表还是不用的好。
table1(strata, labels, groupspan = c(1,1,2),
render=rndr, topclass="Rtable1-zebra"
)
添加P值
添加P值可以通过自定义函数解决,这样做的好处是可以自定义使用的方法,不好的一点是太复杂了,小白不友好,不符合简单快捷的原则。
# 构建函数,对不同类型自定义统计方法
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("<", "<", format.pval(p, digits=3, eps=0.001)))
}
但是添加了P值就不能使用自定义的表头了,果然是鱼与熊掌不可兼得啊
table1(~ . | group, data = predimed,
extra.col=list(`P-value`=pvalue),overall = F,
render.continuous=c(.="Mean ± SD")
)
和CompareGroups比较
CompareGroups
不能自定义复杂表头。但是胜在语法简单,自带P值!
“说到这,你知道用哪个包创建三线表了吗?
comparegroups:使用compareGroups包1行代码生成基线资料表
tableone:使用R语言快速绘制三线表
以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发!
欢迎在评论区留言或直接添加我的微信!
欢迎关注公众号:医学和生信笔记
“医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!
往期回顾
R语言和医学统计学(合辑)
R语言机器学习R包:mlr3(合辑)
mlr3实战:决策树和xgboost预测房价
超详细的R语言热图之complexheatmap系列3
韦恩图进阶!upset plot 02