Werkzeuge zur Herstellung von Latextabellen in R [geschlossen]

268

Auf allgemeine Anfrage ein Community-Wiki zum Erstellen von Latex-Tabellen in R. In diesem Beitrag werde ich einen Überblick über die am häufigsten verwendeten Pakete und Blogs mit Code zum Erstellen von Latex-Tabellen aus weniger einfachen Objekten geben. Bitte fügen Sie alle fehlenden hinzu und / oder geben Sie Tipps, Hinweise und kleine Tricks zur Herstellung schön formatierter Latex-Tische mit R.

Pakete :

  • xtable : für Standardtabellen der meisten einfachen Objekte. Eine schöne Galerie mit Beispielen finden Sie hier .
  • memisc : Tool zur Verwaltung von Umfragedaten , enthält einige Tools für Latextabellen von (grundlegenden) Regressionsmodellschätzungen.
  • Hmisc enthält eine Funktion latex(), die eine Tex-Datei erstellt, die das Objekt Ihrer Wahl enthält. Es ist ziemlich flexibel und kann auch longtableLatex-Tabellen ausgeben . Die Hilfedatei enthält viele Informationen?latex
  • miscFuncs hat eine nette Funktion 'latextable', die Matrixdaten mit gemischten alphabetischen und numerischen Einträgen in eine LaTeX-Tabelle konvertiert und auf der Konsole druckt, damit sie kopiert und in ein LaTeX-Dokument eingefügt werden können.
  • Das texreg- Paket ( JSS-Papier ) konvertiert statistische Modellausgaben in LaTeX-Tabellen. Fügt mehrere Modelle zusammen. Kann mit etwa 50 verschiedenen Modelltypen umgehen, einschließlich Netzwerkmodellen und Mehrebenenmodellen (lme und lme4).
  • reporttools- Paket ( JSS-Papier ) ist eine weitere Option für beschreibende Statistiken zu kontinuierlichen, kategorialen und .
  • Das Tabellenpaket ist möglicherweise das allgemeinste LaTeX-Paket zur Tabellenerstellung in R für beschreibende Statistiken
  • Das stargazer- Paket erstellt schöne vergleichende statistische Modellzusammenfassungstabellen

Blogs und Codefragmente

Verwandte Fragen:

Joris Meys
quelle
4
Bei Cross Validated (stats.SE) ist der folgende Blog-Beitrag für die Leser hier von Interesse: Einige Hinweise zum Erstellen effektiver Tabellen .
Gung - Reinstate Monica
2
Sie können auch ztable verwenden. Es macht Zebrastreifen-Tabellen in LaTeX- und HTML-Formaten einfach. Es ist ziemlich flexibel und einfach: cran.r-project.org/web/packages/ztable/vignettes/ztable.html
Skan
Wie wird "empfohlen", um mit vielen Tabellen in R (oder RStudio) zu arbeiten und sie aus einem externen Latexprogramm wie TexStudio zu verwenden, um sie in ein viel größeres Projekt einzubetten?
Skan
1
@skan Das ist latexspezifisch. Wenn Sie "untergeordnete" Dokumente erstellen, erstellen Sie diese als Latexdokumente und verwenden entweder includeoder input. Sie können verwenden, writeLines()was mit beiden kable()und funktioniert xtable(). Als .tex-Dateien speichern und Problem gelöst.
Joris Meys
1
OTOH, wenn Sie mehrere Dokumente verwenden und diese zu einem kombinieren möchten (bei diesem ist Ihnen nicht klar), erstellen Sie die Dokumente und verwenden Sie input, um ein Dokument in die anderen zu übertragen. Das Latex-Handbuch zeigt Ihnen, dass dies mit der Eingabe des Inhalts des Dokuments an dieser Stelle identisch ist. Daher müssen Sie nicht das gesamte Setup, das Sie in der Präambel vorgenommen haben, kopieren und einfügen.
Joris Meys

Antworten:

22

Ich möchte das "Brew" -Paket erwähnen. Sie können eine Brühvorlagendatei schreiben, die LaTeX mit Platzhaltern wäre, und sie dann "brauen", um eine .tex-Datei zu erstellen, die Sie in Ihr LaTeX einschließen oder eingeben können. Etwas wie:

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

Die Brühsyntax kann auch Schleifen verarbeiten, sodass Sie für jede Zeile eines Datenrahmens eine Tabellenzeile erstellen können.

Spacedman
quelle
Das Paket R.rsp und seine Funktion rstring () ähnelt Brew :: Brew (). Ich bin mir nicht sicher, ob es besser ist, aber das Paket enthält sicherlich mehr Zeug. In beiden Fällen gefällt mir dieser Ansatz, da er mehr Flexibilität im Tex-Code bietet, ohne die Reproduzierbarkeit zu beeinträchtigen.
Richard DiSalvo
21

Vielen Dank an Joris für die Erstellung dieser Frage. Hoffentlich wird daraus ein Community-Wiki.

Die Booktabs-Pakete aus Latex produzieren gut aussehende Tische. Hier ist ein Blog-Beitrag über die Verwendung von xtable zum Erstellen von Latex-Tabellen mit Booktabs

Ich würde das apsrtablePaket auch zum Mix hinzufügen , da es gut aussehende Regressionstabellen erzeugt.

Eine andere Idee: Einige dieser Pakete (insbesondere memisc und apsrtable) ermöglichen eine einfache Erweiterung des Codes, um Tabellen für verschiedene Regressionsobjekte zu erstellen. Ein solches Beispiel ist der in der Frage gezeigte lme4-Memisc-Code. Es kann sinnvoll sein, ein Github-Repository zu starten, um solche Codefragmente zu sammeln, und es im Laufe der Zeit möglicherweise sogar zum Memisc-Paket hinzuzufügen. Irgendwelche Abnehmer?

Ramnath
quelle
18

Das Stargazer- Paket ist eine weitere gute Option. Es unterstützt Objekte aus vielen häufig verwendeten Funktionen und Paketen (lm, glm, svyreg, Survival, pscl, VRE) sowie aus zelig. Zusätzlich zu Regressionstabellen können auch Zusammenfassungsstatistiken für Datenrahmen ausgegeben oder der Inhalt von Datenrahmen direkt ausgegeben werden.

user1953965
quelle
15

Ich habe ein paar Tricks und arbeite an interessanten 'Features' von xtable und Latex, die ich hier teilen werde.

Trick Nr. 1: Entfernen von Duplikaten in Spalten und Trick Nr. 2: Verwenden von Booktabs

Laden Sie zuerst Pakete und definieren Sie meine Clean-Funktion

<<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)} 

Generieren Sie nun einige gefälschte Daten

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)))
            })

Jetzt können wir eine Tabelle generieren und die Bereinigungsfunktion verwenden, um doppelte Einträge in den Beschriftungsspalten zu entfernen.

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

Dies ist eine normale xtable

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

Dies ist eine normale xtable, bei der eine benutzerdefinierte Funktion Duplikate in NA umgewandelt hat

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

Diese Tabelle verwendet das booktab-Paket (und benötigt ein \ usepackage {booktabs} in den Headern).

\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
@ 
PaulHurleyuk
quelle
12

Zwei Dienstprogramme im Paket taRifx können zusammen verwendet werden, um mehrzeilige Tabellen verschachtelter Erben zu erstellen.

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

Beispieltabellenausgabe

Ari B. Friedman
quelle
2
Gibt es eine Möglichkeit, etwas Ähnliches zu tun, jedoch mit einem gesamten Datenrahmen anstelle nur eines Vektors, wie er mit bytable () eingegeben wird?
Thraupidae
5

... und Trick # 3 Mehrzeilige Einträge in einer Xtable

Generieren Sie weitere Daten

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")

Erstellen Sie nun unsere xtable, indem Sie die Funktion sanitize verwenden, um Spaltennamen durch die richtigen Latex-Zeilenumbruchbefehle zu ersetzen (einschließlich doppelter Backslashes, damit R zufrieden ist).

<<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)
            })
@  

(Obwohl dies nicht perfekt ist, da wir \ tabularnewline benötigen, damit die Tabelle korrekt formatiert ist und Xtable immer noch ein final \ einfügt, wird am Ende eine leere Zeile unter der Tabellenüberschrift angezeigt.)

Paul Hurleyuk
quelle
5

Sie können auch die Latextable-Funktion aus dem R-Paket micsFuncs verwenden:

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

latextable (M) wobei M eine Matrix mit gemischten alphabetischen und numerischen Einträgen ist, gibt eine grundlegende LaTeX-Tabelle auf dem Bildschirm aus, die kopiert und in ein LaTeX-Dokument eingefügt werden kann. Wenn es kleine Zahlen gibt, werden diese auch durch die Indexnotation ersetzt (z. B. 1,2 x 10 ^ {- 3}).

Benjamin Taylor
quelle
5

Ein weiteres R-Paket zum Aggregieren mehrerer Regressionsmodelle in LaTeX-Tabellen ist texreg .

Philip Leifeld
quelle