前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R:绘制临床三线表

R:绘制临床三线表

作者头像
Jamesjin63
发布2022-10-25 14:52:35
7160
发布2022-10-25 14:52:35
举报
文章被收录于专栏:EpiHub

R 表格速成

R数据处理能力非常强大,而且输出也非常灵活。当然在R里面的输出都是print字符形式,我们在R里面看到结果很一目了然,但是往往需要把这些结果放在三线表里面。 在临床研究中,我们经常要用到三线表来展示数据与统计值。R可以输出统计参数及检验参数,一个个往上粘贴很困难。

今天就来介绍一个简单有效的数据整理成表格的包。直接上效果图

image.png

数据

这里使用survival自带的数据,pbc,也感谢给了详细介绍。 我们使用pbc临床数据作为案例,来如何使用tableone;为方便展示,这里只选择了7个变量。 首先我们将数据变成tibble格式,然后转换trtstatus为因子。 最后skim一下,看数据的缺失与分布状况。skim有一个好处就是,可以对数据进行整个的概况输出,哪些为因子类factor,哪些为连续性变量numeric。以及n_missing缺失值。hist可以提示这个变量的分布类型,偏态分布还是正态分布。

代码语言:javascript
复制
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

后面会说,如何解决这类问题。

代码语言:javascript
复制
> 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值。 但是没有统计学检验值。

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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 来指定确切概率法检验。

代码语言:javascript
复制
# 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电子表格即可。

代码语言:javascript
复制
write.csv(T3, file = "Table.csv")

同样在Rmarkdown中,最后生成报告,也需要一个美观的Table,只需要

代码语言:javascript
复制
knitr::kable(T3)
DT::datatable(T3)

image.png

参考

What is tableone? Standardized mean difference

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • R 表格速成
  • 数据
  • 基线数据
  • 分组数据
  • 检验方法切换
  • Markdown输出
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档