在R中制作乳胶表的工具

在这篇文章中,我将概述最常用的包和博客,其中包含从不太直接的对象生成latex表的代码。请随意添加任何我错过的,和/或给提示,提示和小技巧,如何用R生成漂亮的乳胶表。

包:

  • xtable:用于大多数简单对象的标准表。可以在在这里中找到一个很好的示例库。
  • memisc:用于管理调查数据的工具,包含一些用于乳胶表(基本)回归模型估计的工具。
  • Hmisc包含一个函数latex(),它创建一个包含所选对象的tex文件。它非常灵活,也可以输出longtable乳胶表。在帮助文件?latex中有很多信息
  • miscFuncs有一个简洁的函数'latextable',它将混合了字母和数字条目的矩阵数据转换为LaTeX表,并将它们打印到控制台,这样它们就可以复制和粘贴到LaTeX文档中。
  • texreg包(js文件)将统计模型输出转换为LaTeX表。合并多个模型。可以处理大约50种不同的模型类型,包括网络模型和多级模型(lme和lme4)。
  • reporttools包(js文件)是对连续、分类和日期变量进行描述性统计的另一个选项。
  • 包可能是R中用于描述性统计的最通用的LaTeX制表包
  • 看星星的人包使不错的比较统计模型汇总表

博客和代码片段

相关问题:

140377 次浏览

感谢Joris提出这个问题。希望它能成为一个社区维基。

在乳胶的booktabs包产生好看的表格。这是一篇关于如何使用xtable来创建使用书签的乳胶表的博客文章

我还会将apsrtable包添加到组合中,因为它可以生成漂亮的回归表。

另一个想法:其中一些包(特别是memisc和apsrtable)允许简单地扩展代码,为不同的回归对象生成表。问题中显示的lme4 memisc代码就是这样一个例子。开始一个github存储库来收集这样的代码片段可能是有意义的,随着时间的推移,甚至可能将其添加到memisc包中。什么人吗?

我想再提一下“酿造”包。您可以编写一个带有占位符的LaTeX模板文件,然后“酿造”它以创建一个.tex文件,以\include或\input到您的LaTeX中。喜欢的东西:

\begin{tabular}{l l}
A & <%= fit$A %> \\
B & <%= fit$B %> \\
\end{tabular}

brew语法还可以处理循环,因此可以为数据框架的每一行创建一个表行。

我有一些关于xtable和Latex有趣的“特性”的技巧和工作,我将在这里分享。

技巧#1:删除列中的重复项和技巧#2:使用书签

首先,加载包并定义clean函数

<<label=first, include=FALSE, echo=FALSE>>=
library(xtable)
library(plyr)


cleanf <- function(x){
oldx <- c(FALSE, x[-1]==x[-length(x)])
# is the value equal to the previous?
res <- x
res[oldx] <- NA
return(res)}

现在生成一些假数据

data<-data.frame(animal=sample(c("elephant", "dog", "cat", "fish", "snake"), 100,replace=TRUE),
colour=sample(c("red", "blue", "green", "yellow"), 100,replace=TRUE),
size=rnorm(100,mean=500, sd=150),
age=rlnorm(100, meanlog=3, sdlog=0.5))


#generate a table
datatable<-ddply(data, .(animal, colour), function(df) {
return(data.frame(size=mean(df$size), age=mean(df$age)))
})

现在我们可以生成一个表,并使用clean函数删除标签列中的重复项。

cleandata<-datatable
cleandata$animal<-cleanf(cleandata$animal)
cleandata$colour<-cleanf(cleandata$colour)
@

这是一个普通的xtable

<<label=normal, results=tex, echo=FALSE>>=
print(
xtable(
datatable
),
tabular.environment='longtable',
latex.environments=c("center"),
floating=FALSE,
include.rownames=FALSE
)
@

这是一个普通的xtable,其中一个自定义函数已经将副本转换为NA

<<label=cleandata, results=tex, echo=FALSE>>=
print(
xtable(
cleandata
),
tabular.environment='longtable',
latex.environments=c("center"),
floating=FALSE,
include.rownames=FALSE
)
@

这个表使用booktab包(并且在头文件中需要一个\usepackage{booktabs})

\begin{table}[!h]
\centering
\caption{table using booktabs.}
\label{tab:mytable}
<<label=booktabs, echo=F,results=tex>>=
mat <- xtable(cleandata,digits=rep(2,ncol(cleandata)+1))
foo<-0:(length(mat$animal))
bar<-foo[!is.na(mat$animal)]
print(mat,
sanitize.text.function = function(x){x},
floating=FALSE,
include.rownames=FALSE,
hline.after=NULL,
add.to.row=list(pos=list(-1,bar,nrow(mat)),
command=c("\\toprule ", "\\midrule ", "\\bottomrule ")))
#could extend this with \cmidrule to have a partial line over
#a sub category column and \addlinespace to add space before a total row
@

... 和技巧#3在Xtable中多行条目

生成更多数据

moredata<-data.frame(Nominal=c(1:5), n=rep(5,5),
MeanLinBias=signif(rnorm(5, mean=0, sd=10), digits=4),
LinCI=paste("(",signif(rnorm(5,mean=-2, sd=5), digits=4),
", ", signif(rnorm(5, mean=2, sd=5), digits=4),")",sep=""),
MeanQuadBias=signif(rnorm(5, mean=0, sd=10), digits=4),
QuadCI=paste("(",signif(rnorm(5,mean=-2, sd=5), digits=4),
", ", signif(rnorm(5, mean=2, sd=5), digits=4),")",sep=""))


names(moredata)<-c("Nominal", "n","Linear Model \nBias","Linear \nCI", "Quadratic Model \nBias", "Quadratic \nCI")

现在生成我们的xtable,使用sanze函数用正确的Latex换行命令替换列名(包括双反斜杠,这样R就满意了)

<<label=multilinetable, results=tex, echo=FALSE>>=
foo<-xtable(moredata)
align(foo) <- c( rep('c',3),'p{1.8in}','p{2in}','p{1.8in}','p{2in}' )
print(foo,
floating=FALSE,
include.rownames=FALSE,
sanitize.text.function = function(str) {
str<-gsub("\n","\\\\", str, fixed=TRUE)


return(str)
},
sanitize.colnames.function = function(str) {
str<-c("Nominal", "n","\\centering Linear Model\\\\ \\% Bias","\\centering Linear \\\\ 95\\%CI", "\\centering Quadratic Model\\\\ \\%Bias", "\\centering Quadratic \\\\ 95\\%CI \\tabularnewline")
return(str)
})
@

(虽然这并不完美,因为我们需要\tabularnewline来正确格式化表格,Xtable仍然放入一个最终的\,所以我们最终在表头下面有一个空行。)

taRifx包中的两个实用程序可以协同使用,以生成嵌套层次结构的多行表。

library(datasets)
library(taRifx)
library(xtable)


test.by <- bytable(ChickWeight$weight, list( ChickWeight$Chick, ChickWeight$Diet) )
colnames(test.by) <- c('Diet','Chick','Mean Weight')
print(latex.table.by(test.by), include.rownames = FALSE, include.colnames = TRUE, sanitize.text.function = force)
#   then add \usepackage{multirow} to the preamble of your LaTeX document
#   for longtable support, add ,tabular.environment='longtable' to the print command (plus add in ,floating=FALSE), then \usepackage{longtable} to the LaTeX preamble

sample table output

你也可以使用R包micsFuncs中的latextable函数:

http://cran.r-project.org/web/packages/miscFuncs/index.html

latextable(M),其中M是一个混合字母和数字条目的矩阵,输出一个基本的LaTeX表到屏幕上,可以复制和粘贴到LaTeX文档中。如果有小数字,它也用索引符号替换这些数字(例如1.2x10^{-3})。

另一个用于将多个回归模型聚合到LaTeX表中的R包是texreg

看星星的人包是另一个不错的选择。它支持来自许多常用函数和包(lm、glm、svyreg、survival、pscl、AER)以及来自zelig的对象。除了回归表,它还可以输出数据帧的汇总统计,或者直接输出数据帧的内容。