我找不到一种真正直观的方法来做最基本的事情;用我的基本变量创建一个汇总表。我发现的最好的方法是目前使用tapply:
seed(200)
my_stats <- function(x){
if (is.factor(x)){
a <- table(x, useNA="no")
b <- round(a*100/sum(a),2)
# If binary
if (length(a) == 2){
ret <- paste(a[1], " (", b[1], " %)", sep="")
}
return(ret)
}else{
ret <- mean(x, na.rm=T)
if (ret < 1){
ret <- round(ret, 2)
}else{
ret <- round(ret)
}
return(ret)
}
}
library(rms)
groups <- factor(sample(c("Group A","Group B"), size=51, replace=T))
a <- 3:53
b <- rnorm(51)
c <- factor(sample(c("male","female"), size=51, replace=T))
res <- rbind(a=tapply(a, groups, my_stats),
b=tapply(b, groups, my_stats),
c=tapply(c, groups, my_stats))
latex(latexTranslate(res))
res包含:
> res
Group A Group B
a "28" "28"
b "-0.08" "-0.21"
c "14 (56 %)" "14 (53.85 %)"
现在这是可行的,但它看起来非常复杂,不是最优雅的解决方案。我试着搜索如何创建描述性表,但所有的都集中在table()、prop.table()、summary()上,只针对单个变量或同类变量。
我的问题是:有没有一个包/功能可以简单地创建一个好看的乳胶桌子?如果是,请提示如何获得上述结果。
谢谢!
如果重写函数,使其始终返回字符串(有时返回字符串,有时返回数字,有时返回NULL),您可以在data.frame上调用ddply
,而不必指定所有列。
f <- function(u) {
res <- "?"
if(is.factor(u) || is.character(u)) {
u <- table(u, useNA = "no")
if (length(u) == 0 || sum(u) == 0) { res <- "NA" }
else { res <- sprintf( "%0.0f%%", 100 * u[1] / sum(u) ) }
} else {
u <- mean(u, na.rm=TRUE)
if(is.na(u)) { res <- "NA" }
else { res <- sprintf( ifelse( abs(u) < 1, "%0.2f", "%0.0f" ), u ) }
}
return( res )
}
# Same function, for data.frames
g <- function(d) do.call( data.frame, lapply(d, f) )
library(plyr)
ddply(data.frame(a,b,c), .(groups), g)
由于您想要LaTeX表,您可能还想尝试以下操作,该操作不会对数据进行分组,而是为数值变量添加稀疏直方图。
library(Hmisc)
latex(describe(d), file="")
你的问题有点开放,因为你很可能会在什么是"好看的LaTeX表"的问题上与我意见相左。
例如,我可能更喜欢按行而不是按列来组织:
require(plyr)
require(xtable)
dat <- data.frame(a,b,c,groups)
xtable(ddply(dat,.(groups),summarise,a = my_stats(a),
b = my_stats(b),
c = my_stats(c)))
begin{table}[ht]
begin{center}
begin{tabular}{rlrrl}
hline
& groups & a & b & c \
hline
1 & Group A & 28.00 & 0.14 & 13 (52 %) \
2 & Group B & 28.00 & -0.00 & 13 (50 %) \
hline
end{tabular}
end{center}
end{table}
当然,如果您查看?xtable
和?print.xtable
,其中大部分都是可定制的。
查看tables
包,了解另一种可能使其更简单的方法。
如果您想创建一个同时包含类别变量和连续变量的汇总表,您应该查看包"tableone"。
以下是它的功能示例https://rpubs.com/kaz_yos/tableone-vignette.这是pdf文档:https://cran.r-project.org/web/packages/tableone/tableone.pdf
我希望这能有所帮助。
- Mike