R包-创建统计汇总表

统计汇总表是一个非常有用的数据展示方法,比如临床分析中,临床三线表就是一个典型的例子

一般在处理数据时,如果想对数据集做点简单统计,Hmisc包的describe函数会比较好用;如果想将统计汇总结果以html形式作为最终展示,这是可以参照这篇博文(写得非常的帮!!!)– How to Easily Create Descriptive Summary Statistics Tables in R Studio – By Group,因此分享一下,该文章总共归纳了9个用于创建汇总表的R包:

  • arsenal
  • qwraps2
  • amisc
  • table1
  • tangram
  • furniture
  • tableone
  • compareGroups
  • htmltable

下面我主要记录下table1包和arsenal包的使用经验,其他包以及更加详细的参数调整可看具体对应的文档


常规的需求上述包均能实现,差别在于不同的展现形式罢了,因此有需求的话可以都试用下

其中table1包可能是见的比较多的,对其衍生的包也有些;常见的用法可见其文档:Using the table1 Package to Create HMTL Tables of Descriptive Statistics

其中我比较感兴趣的是其可以人为个人性化的增加多列信息,比如在其文档中增加了统计分析的P值;而我的需求则是则是增加多列,如统计量和P值两列,因此我对例子的代码做了些调整,从而实现可以增加N列信息,比如代码如下:

library(MatchIt)
library(table1)
data(lalonde)

lalonde$treat    <- factor(lalonde$treat, levels=c(0, 1, 2, 3), labels=c("Control", "Treatment", "P-value", "statistics"))
lalonde$black    <- factor(lalonde$black)
lalonde$hispan   <- factor(lalonde$hispan)
lalonde$married  <- factor(lalonde$married)
lalonde$nodegree <- factor(lalonde$nodegree)
lalonde$black    <- as.logical(lalonde$black == 1)
lalonde$hispan   <- as.logical(lalonde$hispan == 1)
lalonde$married  <- as.logical(lalonde$married == 1)
lalonde$nodegree <- as.logical(lalonde$nodegree == 1)

label(lalonde$black)    <- "Black"
label(lalonde$hispan)   <- "Hispanic"
label(lalonde$married)  <- "Married"
label(lalonde$nodegree) <- "No high school diploma"
label(lalonde$age)      <- "Age"
label(lalonde$re74)     <- "1974 Income"
label(lalonde$re75)     <- "1975 Income"
label(lalonde$re78)     <- "1978 Income"
units(lalonde$age)      <- "years"

z <<- 0
rndr <- function(x, name, ...) {
  if (length(x) == 0 & z == 0) {
    z <<- z + 1
    y <- lalonde[[name]]
    s <- rep("", length(render.default(x=y, name=name, ...)))
    if (is.numeric(y)) {
      p <- t.test(y ~ lalonde$treat)$p.value
    } else {
      p <- chisq.test(table(y, droplevels(lalonde$treat)))$p.value
    }
    s[2] <- sub("<", "&lt;", format.pval(p, digits=3, eps=0.001))
    s
  } else if (length(x) == 0 & z == 1) {
    z <<- 0
    y <- lalonde[[name]]
    s <- rep("", length(render.default(x=y, name=name, ...)))
    if (is.numeric(y)) {
      p <- t.test(y ~ lalonde$treat)$p.value
    } else {
      p <- chisq.test(table(y, droplevels(lalonde$treat)))$p.value
    }
    s[2] <- "test"
    s
  }else {
    render.default(x=x, name=name, ...)
  }
}

rndr.strat <- function(label, n, ...) {
  ifelse(n==0, label, render.strat.default(label, n, ...))
}

table1(~ age + black + hispan + married + nodegree + re74 + re75 + re78 | treat,
       data=lalonde, droplevels=F, render=rndr, render.strat=rndr.strat, overall=F)

table1_plot


但是table1包没有给定函数用于导出html文件,除非手动在Rstudio中导出,或者使用htmltools包的save_html函数来导出;但是导出的html格式的表格会缺失一些样式,比较尴尬。。。

因此我后来试了下arsenal包,该包功能非常齐全(开发者真给力!),上述文章作者也给出了Powerfull评价,从修改表格形式以及导出均有函数可调用,可查看文档:The tableby function

我感兴趣的是该包的html导出的方法,其是使用了rmarkdown的形式进行结果导出,所以如果懂得如何使用rmarkdown,就大致会明白其原理了(值得学习下);因此在使用这个功能的前提,需要先安装好rmarkdown以及pandoc等配置

其导出函数可以支持.csvhtml以及doc等格式。。。

arsenal包也支持在原有的统计列基础上新增个性化需求的统计列,但是其可能只能增加一列(可能也是我没调试出来),但一个折中的办法是:将多列合并在一列中;因此还是以lalonde数据集为例,代码如下:

library(arsenal)
library(MatchIt)
data(lalonde)

lalonde$black    <- factor(lalonde$black, levels = c(0,1), labels = c("0","1"))
lalonde$hispan   <- factor(lalonde$hispan, levels = c(0,1), labels = c("0","1"))
lalonde$married  <- factor(lalonde$married, levels = c(0,1), labels = c("0","1"))
lalonde$nodegree <- factor(lalonde$nodegree, levels = c(0,1), labels = c("0","1"))

table_one <- tableby(treat ~ age + black + hispan + married + nodegree, data = lalonde)

mypval <- data.frame(
  byvar = "treat",
  variable = c('age','black','hispan','married','nodegree'), 
  adj.pvalue = c("X = 1, P = 0.01", "X = 2, P = 0.02", "X = 3, P = 0.03", "X = 4, P = 0.04", "X = 5, P = 0.05"), 
  method = c('Age/Sex adjusted model results')
)
tab_two <- modpval.tableby(table_one, mypval, use.pname=TRUE)
summary(tab_two)
write2html(tab_two, "../Desktop/222.html")

arsenal_plot

其他样式可参照文档或者参照上述那篇博文。。。

本文出自于http://www.bioinfo-scrounger.com转载请注明出处

文章目录
|