统计汇总表是一个非常有用的数据展示方法,比如临床分析中,临床三线表就是一个典型的例子
一般在处理数据时,如果想对数据集做点简单统计,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("<", "<", 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包没有给定函数用于导出html文件,除非手动在Rstudio中导出,或者使用htmltools包的save_html
函数来导出;但是导出的html格式的表格会缺失一些样式,比较尴尬。。。
因此我后来试了下arsenal包,该包功能非常齐全(开发者真给力!),上述文章作者也给出了Powerfull评价,从修改表格形式以及导出均有函数可调用,可查看文档:The tableby function
我感兴趣的是该包的html导出的方法,其是使用了rmarkdown的形式进行结果导出,所以如果懂得如何使用rmarkdown,就大致会明白其原理了(值得学习下);因此在使用这个功能的前提,需要先安装好rmarkdown以及pandoc等配置
其导出函数可以支持.csv
、html
以及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")

其他样式可参照文档或者参照上述那篇博文。。。
本文出自于http://www.bioinfo-scrounger.com转载请注明出处