R 表格速成
R数据处理能力非常强大,而且输出也非常灵活。当然在R里面的输出都是print字符形式,我们在R里面看到结果很一目了然,但是往往需要把这些结果放在三线表里面。
在临床研究中,我们经常要用到三线表来展示数据与统计值。R可以输出统计参数及检验参数,一个个往上粘贴很困难。
今天就来介绍一个简单有效的数据整理成表格的包。直接上效果图
数据
这里使用survival
自带的数据,pbc
,也感谢给了详细介绍。 我们使用pbc临床数据作为案例,来如何使用tableone
;为方便展示,这里只选择了7个变量。
首先我们将数据变成tibble格式,然后转换trt
与status
为因子。
最后skim一下,看数据的缺失与分布状况。skim有一个好处就是,可以对数据进行整个的概况输出,哪些为因子类factor
,哪些为连续性变量numeric
。以及n_missing
缺失值。hist
可以提示这个变量的分布类型,偏态分布还是正态分布。
library(survival)
library(tableone)
library(skimr)
## Load data
data(pbc)
pbc=pbc %>% as.tbl() %>%
mutate(trt=factor(trt,labels = c("yes","no")),
status=factor(status, labels =c("status","edema","stage")))
df=pbc %>% as.tbl() %>%
mutate(trt=factor(trt,labels = c("yes","no")),
status=factor(status, labels =c("status","edema","stage"))) %>%
select(time,age,sex,status,trt,bili,platelet)
df
> df
# A tibble: 418 x 7
time age sex status trt bili platelet
<int> <dbl> <fct> <fct> <fct> <dbl> <int>
1 400 58.8 f stage yes 14.5 190
2 4500 56.4 f status yes 1.1 221
3 1012 70.1 m stage yes 1.4 151
4 1925 54.7 f stage yes 1.8 183
5 1504 38.1 f edema no 3.4 136
6 2503 66.3 f stage no 0.8 NA
7 1832 55.5 f status no 1 204
8 2466 53.1 f stage no 0.3 373
9 2400 42.5 f stage yes 3.2 251
10 51 70.6 f stage no 12.6 302
# … with 408 more rows
> skim(df)
── Data Summary ────────────────────────
Values
Name df
Number of rows 418
Number of columns 7
_______________________
Column type frequency:
factor 3
numeric 4
________________________
Group variables None
── Variable type: factor ──────────────────────────────────────────────────────────────────────────────
skim_variable n_missing complete_rate ordered n_unique top_counts
1 sex 0 1 FALSE 2 f: 374, m: 44
2 status 0 1 FALSE 3 sta: 232, sta: 161, ede: 25
3 trt 106 0.746 FALSE 2 yes: 158, no: 154
── Variable type: numeric ─────────────────────────────────────────────────────────────────────────────
skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
1 time 0 1 1918. 1105. 41 1093. 1730 2614. 4795 ▅▇▆▃▂
2 age 0 1 50.7 10.4 26.3 42.8 51.0 58.2 78.4 ▂▆▇▅▁
3 bili 0 1 3.22 4.41 0.3 0.8 1.4 3.4 28 ▇▁▁▁▁
4 platelet 11 0.974 257. 98.3 62 188. 251 318 721 ▅▇▃▁▁
基线数据
我们来看一下,tableone汇总的结果,这个比skim简洁,是我们临床上想要的基线资料,(mean (SD)) 及(%) 。而且也不需要指定哪些为分类变量,哪些为连续性变量,因为在一开始我们就mutate了数据类型。
但是我们发现:
没有中位数
分类变量只显示F
后面会说,如何解决这类问题。
> CreateTableOne(data = df)
Overall
n 418
time (mean (SD)) 1917.78 (1104.67)
age (mean (SD)) 50.74 (10.45)
sex = f (%) 374 (89.5)
status (%)
status 232 (55.5)
edema 25 ( 6.0)
stage 161 (38.5)
trt = no (%) 154 (49.4)
bili (mean (SD)) 3.22 (4.41)
platelet (mean (SD)) 257.02 (98.33)
分组数据
上面是汇总的数据,那么我们需要按组来分组展示,譬如以trt为group。
看到这个输出,我们觉得,嗯,这就是我们要的结果,后面也给出了具体的p值。
但是没有统计学检验值。
T1=CreateTableOne(data=df,strata = c("trt"))
T1
Stratified by trt
yes no p test
n 158 154
time (mean (SD)) 2015.62 (1094.12) 1996.86 (1155.93) 0.883
age (mean (SD)) 51.42 (11.01) 48.58 (9.96) 0.018
sex = f (%) 137 (86.7) 139 ( 90.3) 0.421
status (%) 0.894
status 83 (52.5) 85 ( 55.2)
edema 10 ( 6.3) 9 ( 5.8)
stage 65 (41.1) 60 ( 39.0)
trt = no (%) 0 ( 0.0) 154 (100.0) <0.001
bili (mean (SD)) 2.87 (3.63) 3.65 (5.28) 0.131
platelet (mean (SD)) 258.75 (100.32) 265.20 (90.73) 0.555
或者我们print一下,其实很多参数都是在print中设置,详情见微调基线特征表1输出格式。
只需要添加showAllLevels = TRUE
即可显示factor
的全部level
。
或者可以再显示全部的total
# add level
print(T1,showAllLevels = TRUE)
Stratified by trt
level yes no p test
n 158 154
time (mean (SD)) 2015.62 (1094.12) 1996.86 (1155.93) 0.883
age (mean (SD)) 51.42 (11.01) 48.58 (9.96) 0.018
sex (%) m 21 ( 13.3) 15 ( 9.7) 0.421
f 137 ( 86.7) 139 ( 90.3)
status (%) status 83 ( 52.5) 85 ( 55.2) 0.894
edema 10 ( 6.3) 9 ( 5.8)
stage 65 ( 41.1) 60 ( 39.0)
trt (%) yes 158 (100.0) 0 ( 0.0) <0.001
no 0 ( 0.0) 154 (100.0)
bili (mean (SD)) 2.87 (3.63) 3.65 (5.28) 0.131
platelet (mean (SD)) 258.75 (100.32) 265.20 (90.73) 0.555
# add total
T2=CreateTableOne(data=df,strata = c("trt"),addOverall = T)
T2
Stratified by trt
Overall yes no p test
n 418 158 154
time (mean (SD)) 1917.78 (1104.67) 2015.62 (1094.12) 1996.86 (1155.93) 0.883
age (mean (SD)) 50.74 (10.45) 51.42 (11.01) 48.58 (9.96) 0.018
sex = f (%) 374 (89.5) 137 (86.7) 139 ( 90.3) 0.421
status (%) 0.894
status 232 (55.5) 83 (52.5) 85 ( 55.2)
edema 25 ( 6.0) 10 ( 6.3) 9 ( 5.8)
stage 161 (38.5) 65 (41.1) 60 ( 39.0)
trt = no (%) 154 (49.4) 0 ( 0.0) 154 (100.0) <0.001
bili (mean (SD)) 3.22 (4.41) 2.87 (3.63) 3.65 (5.28) 0.131
platelet (mean (SD)) 257.02 (98.33) 258.75 (100.32) 265.20 (90.73) 0.555
检验方法切换
有时候,并不是所有数据都是服从正态分布,频数分布有时候也需要用到Fisher 检验,这时候需要我们自定义了。
这里在Print
需要用nonnormal
来指定哪些变量为非正态分布及exact
来指定确切概率法检验。
# with nonnormal and exact
T3=print(T1,showAllLevels = TRUE,nonnormal = c("bili","platelet"),
exact = "sex")
Stratified by trt
level yes no p test
n 158 154
time (mean (SD)) 2015.62 (1094.12) 1996.86 (1155.93) 0.883
age (mean (SD)) 51.42 (11.01) 48.58 (9.96) 0.018
sex (%) m 21 ( 13.3) 15 ( 9.7) 0.377 exact
f 137 ( 86.7) 139 ( 90.3)
status (%) status 83 ( 52.5) 85 ( 55.2) 0.894
edema 10 ( 6.3) 9 ( 5.8)
stage 65 ( 41.1) 60 ( 39.0)
trt (%) yes 158 (100.0) 0 ( 0.0) <0.001
no 0 ( 0.0) 154 (100.0)
bili (median [IQR]) 1.40 [0.80, 3.20] 1.30 [0.72, 3.60] 0.842 nonnorm
platelet (median [IQR]) 255.00 [189.50, 322.00] 259.50 [206.75, 322.50] 0.455 nonnorm
Markdown输出
我们上述的结果都在R consle里面,但是最后还是要回归到三线表,
那么如何输出呢?这里给出了答案。R语言统计与绘图:快速绘制临床基线特征表1
简单粗暴的方法:就是复制粘贴,使用quote = TRUE显示引号,使用noSpaces = TRUE删除用于在R控制台中对齐文本的空格,然后直接复制基线表整个内容并将其粘贴到Excel电子表格即可。
write.csv(T3, file = "Table.csv")
同样在Rmarkdown中,最后生成报告,也需要一个美观的Table,只需要
knitr::kable(T3)
DT::datatable(T3)