用于在R中制作乳胶表的工具


268

在一般要求下,一个有关在R中生成乳胶表的社区Wiki。在本文中,我将概述最常用的软件包和博客,并提供用于从不太直接的对象生成乳胶表的代码。请随时添加我错过的任何内容,和/或提供有关如何使用R生成格式正确的乳胶表的提示,技巧和小技巧。

包装方式:

  • xtable:用于大多数简单对象的标准表。可以在此处找到带有示例的不错的画廊。
  • memisc:用于管理调查数据的工具,包含一些用于(基本)回归模型估计值的乳胶表的工具。
  • Hmisc包含一个函数latex(),该函数创建一个包含所选对象的tex文件。它非常灵活,还可以输出longtable乳胶表。帮助文件中有很多信息?latex
  • miscFuncs具有一个简洁的函数“ latextable”,该函数可将具有字母和数字混合条目的矩阵数据转换为LaTeX表并将其打印到控制台,以便可以将其复制并粘贴到LaTeX文档中。
  • texreg软件包(JSS纸)将统计模型输出转换为LaTeX表。合并多个模型。可以处理大约50种不同的模型类型,包括网络模型和多层模型(lme和lme4)。
  • reporttools软件包(JSS文件)是用于连续,分类和日期变量的描述性统计的另一个选项。
  • 表格包可能是R中用于描述性统计的最通用的LaTeX表格制作包
  • Stargazer软件包使比较统计模型汇总表更好

博客和代码片段

相关问题:


4
在交叉验证(stats.SE)上,下面的博客文章将引起读者的兴趣:有关制作有效表格的一些注意事项
gung-恢复莫妮卡

2
您也可以使用ztable。它使LaTeX和HTML格式的斑马条纹表格变得容易。它非常灵活和简单: cran.r-project.org/web/packages/ztable/vignettes/ztable.html
skan

建议使用“ R”(或RStudio)中的许多表并从外部Latex程序(例如TexStudio)中使用它们的“程序”将它们嵌入到更大的项目中吗?
skan,

1
@skan这是特定于乳胶的。如果创建“子级”文档,则将它们创建为乳胶文档,并使用includeinput。您可以使用writeLines()它与这两个工作kable()xtable()。存储为.tex文件,问题已解决。
Joris Meys '17

1
OTOH,如果您使用多个文档并将其合并为一个文档(不清楚该文档),则可以创建文档,然后input将一个文档合并到另一个文档中。乳胶手册将告诉您,这与在该位置上键入文档的内容相同,因此无需复制粘贴您在序言中所做的整个设置。
乔里斯·梅斯

Answers:


22

我想提到“酿造”包装。您可以编写一个带有占位符的LaTeX的brew模板文件,然后对其进行“ brew”以创建一个.tex文件,以将\ include或\ input输入到LaTeX中。就像是:

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

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


包R.rsp及其函数rstring()与brew :: brew()类似。不知道它是否更好,但是包装中肯定有更多东西。无论哪种情况,我都喜欢这种方法,因为它在tex代码中提供了更大的灵活性,同时又不牺牲可重复性。
理查德·迪萨沃

21

感谢Joris提出这个问题。希望它将成为社区Wiki。

乳胶中的booktabs包产生漂亮的表。这是有关如何使用xtable 创建使用booktabs的乳胶表的博客文章

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

另一个想法:其中一些软件包(尤其是memisc和apsrtable)允许轻松扩展代码以生成用于不同回归对象的表。一个这样的例子就是问题中显示的lme4 memisc代码。启动github存储库以收集此类代码片段可能很有意义,随着时间的流逝,甚至可能将其添加到memisc包中。有没有人?


18

斯塔盖泽包是另一个不错的选择。它支持来自许多常用功能和包(lm,glm,svyreg,surviving,pscl,AER)以及zelig的对象。除了回归表,它还可以输出数据帧的摘要统计信息,或直接输出数据帧的内容。


15

我有一些技巧和变通方法,可以在这里分享xtable和Latex的有趣“功能”。

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

首先,加载包并定义我的清理函数

<<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函数删除label列中的重复条目。

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
@ 

12

可以同时使用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

样本表输出


2
有没有办法做类似的事情,但是要用整个数据帧,而不是用bytable()输入的一个矢量?
Thraupidae '04

5

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

产生更多数据

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,使用sanitize函数将列名称替换为正确的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仍放在最终的\中,因此我们在表头下方以空白行结尾。)



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.