R-论文三线表快速实现-update

经常在报道基线资料时候,会设计表格,需要摘录统计结果,非常麻烦的调整表格。
今天本文章利用compareGroups就解决这样的问题。

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

image.png

Tableone包

之前介绍过一期利用 Tableone包实现三线表,最终的展现效果很好。但是有些功能不好实现。譬如OR与RR值的展示。具体操作见:R:绘制临床三线表 -https://www.jianshu.com/p/bfb038bd55cd

compareGroups包

同样是实现数据的汇总描述,compareGroups包有以下有点。

  • 可支持多种数据导入,如haven、readxl、readr等,也接受Tibble类型数据集。
  • 内置descrTable的新函数,只需一步就可以构建描述性表。
  • 支持R-markdown文档,支持HTML的分层表。
  • 内置strataTable的新功能,可以按层(变量的值或级别)构建描述性表。
  • 日期变量被视为连续非正态,执行中位数、四分位数和非参数检验。
  • 在compareGroups和descrTable中添加新的参数var.equal。这允许在比较两组以上的比较。

官网文档见: compareGroups 4.0: Descriptives by groups

案例展示

所有数据均来自于data(predimed)

image.png

根据age、sex、smoke、waist、hormogroup五个因素,进行组间比较。我们可以看到res的输出结果,包含每个变量的组间p值及使用的统计方法。

我们可以直接输出全部的表格汇总,或者根据分组变量进行展示:

library(compareGroups)
library(tidyverse)
data(predimed)
head(predimed)
# ALL data
descrTable( ~ ., data = predimed)

# ALL data by group
descrTable(group ~ ., data = predimed)

1.三线表展示

但是,这不是我们想要的。我们要一个描述性的表格。

res <- compareGroups(group ~ age + sex + smoke + waist + hormo, 
    data = predimed)
res

-------- Summary of results by groups of 'Intervention group'---------


  var                         N    p.value  method            selection
1 Age                         6324 0.003**  continuous normal ALL      
2 Sex                         6324 <0.001** categorical       ALL      
3 Smoking                     6324 0.444    categorical       ALL      
4 Waist circumference         6324 0.045**  continuous normal ALL      
5 Hormone-replacement therapy 5661 0.850    categorical       ALL      
-----
Signif. codes:  0 '**' 0.05 '*' 0.1 ' ' 1 

只需要增加一个createTable(res)函数,即可实现描述性表格的展示

createTable(res)
image.png

2.非正态数据指定

那如果有非正态分布;我们需要对非正态分布进行指定,使用下面方法进行指定。

  • 这里method 变量=1表示比较使用正态分布,
  • 变量=2表示使用四分位间距,
  • 变量=3表示使用分类变量比较,
  • 变量=NA表示自动根据Shapiro-Wilks检测,做出是正态还是非正态方法

我们这里的案例,展示age跟waist都用非正态分布。

createTable(res)
## add non-normal test
res=compareGroups(group ~ age + smoke + waist + hormo, data = predimed, 
                  method = c(waist = 2, age = 2))

createTable(res)
image.png

更多参数调试,见官方网站 https://cran.r-project.org/web/packages/compareGroups/vignettes/compareGroups_vignette.html

3.图形展示

compareGroups还有更多的功能,譬如对res进行summary会获得更多的信息。

另外,compareGroups还提供绘图功能。为此我们进一步对三线表的内容进行可视化。这也是compareGroups的一个优点。但是仅作为探索性分析的展示。

summary(res) 
plot(res)
image.png

如果用做论文发表,这个图还是算了吧。

4.OR或HR的展示

compareGroups这一功能是比较优秀的。也是这里所要介绍给大家的。因为Tableone不能汇总OR跟RR的信息,需要单独计算,然后排列。

我们的因变量y必须是二分类或者生存数据,才会产生OR与HR的比值比。

这里我们还是用predimed数据,但是因变量转成htn 二分类变量。当然,自变量分类等级的参考也可以进行更改。这里默认是第一个。如果需要更改,见https://cran.r-project.org/web/packages/compareGroups/vignettes/compareGroups_vignette.html#subsetting

res1 <- compareGroups(htn ~ age + sex + bmi + smoke, data = predimed, 
    ref = 1)
createTable(res1, show.ratio = TRUE)
image.png

接下来是HR的展示。这里面比OR要多一步,就是指定结局变量及利用Sur模型,先建立生存分析的模型。

library(survival)
predimed$tmain <- with(predimed, Surv(toevent, event == "Yes"))

createTable(compareGroups(tmain ~ group + age + sex, data = predimed), 
            show.ratio = TRUE)
image.png

5.表格的输出

计算的结果可以导出各种各样的格式结果:Tables can be exported to CSV, HTML, LaTeX, PDF, Markdown, Word or Excel;这里我们只展示Excel格式。

  • export2csv(restab, file='table1.csv'), exports to CSV format
  • export2html(restab, file='table1.html'), exports to HTML format
  • export2latex(restab, file='table1.tex'), exports to LaTeX format (to be included in Swaeave documents R chunks)
  • export2pdf(restab, file='table1.pdf'), exports to PDF format
  • export2md(restab, file='table1.md'), to be included inside Markdown documents R chunks
  • export2word(restab, file='table1.docx'), exports to Word format
  • export2xls(restab, file='table1.xlsx'), exports to Excel format
export2xls(createTable(res), file='table1.xlsx')
image.png

6.compareGroups包缺点

主要是compareGroups的结果不能用DT::datatable展示,就是他的结果可以print,也可以保存本地csv、excel。

DT::datatable(createTable(res1, show.ratio = TRUE))

这里要实现Tableone的结果,就导出csv文件,然后再读入进来。即可对compareGroups的结果用DT::datatable展示。

library(tidyverse)
export2csv(x, file='table1.csv')
xa=read.csv('table1.csv',header=T)
DT::datatable(xa)

image.png

7.compareGroups自动识别正态性非正态性

mename=paste0(colnames(df)[-11],"=NA")
toString(mename)

ti=paste0("compareGroups(group~ .,data = df,",
          "method = c(",toString(mename),"))")
x=eval(parse(text=ti))
tablenew=createTable(x,show.all = TRUE)
print(tablenew)


export2xls(tablenew,file = "table1.xls")

当然compareGroups还有更多功能,分层展示,小数点调整,但是这些都是细节。我们先出一个总的三线表。然后慢慢在去研究细节问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容