Outils pour fabriquer des tables en latex en R [fermé]

268

Sur demande générale, un wiki communautaire sur la production de tables en latex dans R. Dans cet article, je vais donner un aperçu des packages et des blogs les plus couramment utilisés avec du code pour produire des tables en latex à partir d'objets moins simples. N'hésitez pas à ajouter tout ce que j'ai manqué et / ou à donner des conseils, des astuces et de petites astuces sur la façon de produire des tableaux en latex bien formatés avec R.

Paquets :

  • xtable : pour les tableaux standard de la plupart des objets simples. Une belle galerie avec des exemples peut être trouvée ici .
  • memisc : outil de gestion des données d'enquête, contient des outils pour les tableaux en latex d'estimations du modèle de régression (de base).
  • Hmisc contient une fonction latex()qui crée un fichier tex contenant l'objet de choix. Il est assez flexible et peut également produire longtabledes tables en latex. Il y a beaucoup d'informations dans le fichier d'aide?latex
  • miscFuncs a une fonction soignée 'Latextable' qui convertit les données de la matrice avec des entrées alphabétiques et numériques mixtes dans une table LaTeX et les imprime sur la console, afin qu'elles puissent être copiées et collées dans un document LaTeX.
  • Le paquet texreg ( papier JSS ) convertit la sortie du modèle statistique en tables LaTeX. Fusionne plusieurs modèles. Peut gérer environ 50 types de modèles différents, y compris des modèles de réseau et des modèles à plusieurs niveaux (lme et lme4).
  • Le package reporttools ( papier JSS ) est une autre option pour les statistiques descriptives sur les variables continues, catégoriques et de date.
  • Le package tables est peut-être le package de création de tables LaTeX le plus général dans R pour les statistiques descriptives
  • package stargazer fait de beaux tableaux récapitulatifs de modèles statistiques comparatifs

Blogs et extraits de code

Questions connexes :

Joris Meys
la source
4
Sur Cross Validated (stats.SE), le blog suivant intéressera les lecteurs ici: Quelques notes sur la création de tableaux efficaces .
gung - Rétablir Monica
2
Vous pouvez également utiliser ztable. Il crée facilement des tableaux à rayures zébrées aux formats LaTeX et HTML. C'est assez flexible et simple: cran.r-project.org/web/packages/ztable/vignettes/ztable.html
skan
Quelle est la "procédure" suggérée pour travailler avec de nombreuses tables dans R (ou RStudio) et les utiliser à partir d'un programme Latex externe, tel que TexStudio, pour les intégrer dans un projet beaucoup plus vaste?
skan
1
@skan C'est spécifique au latex. Si vous créez des documents "enfants", vous les créez en tant que documents en latex et utilisez soit includeou input. Vous pouvez utiliser writeLines()ce qui fonctionne avec kable()et xtable(). Stockez en tant que fichiers .tex et problème résolu.
Joris Meys
1
OTOH, si vous utilisez plusieurs documents et que vous souhaitez les combiner en un seul (vous n'êtes pas clair sur celui-ci), vous créez les documents et vous utilisez inputpour obtenir un document dans les autres. Le manuel latex vous dira que cela revient à taper le contenu du document à cet endroit, il n'est donc pas nécessaire de copier-coller la configuration complète que vous avez faite dans le préambule.
Joris Meys

Réponses:

22

Je voudrais ajouter une mention du package "brew". Vous pouvez écrire un fichier de modèle de brassage qui serait LaTeX avec des espaces réservés, puis le "brasser" pour créer un fichier .tex à \ inclure ou \ entrer dans votre LaTeX. Quelque chose comme:

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

La syntaxe de brassage peut également gérer les boucles, vous pouvez donc créer une ligne de tableau pour chaque ligne d'une trame de données.

Spacedman
la source
Le package R.rsp et sa fonction rstring () est similaire à brew :: brew (). Je ne sais pas si c'est mieux, mais le paquet contient certainement plus de choses. Dans les deux cas, j'aime cette approche car elle donne plus de flexibilité dans le code tex tout en ne sacrifiant pas la reproductibilité.
Richard DiSalvo
21

Merci Joris d'avoir créé cette question. Avec un peu de chance, il sera transformé en wiki communautaire.

Les packages booktabs en latex produisent de belles tables. Voici un article de blog sur la façon d'utiliser xtable pour créer des tables en latex qui utilisent des librairies

Je voudrais également ajouter le apsrtablepackage au mélange car il produit de belles tables de régression.

Une autre idée: certains de ces packages (en particulier memisc et apsrtable) permettent des extensions faciles du code pour produire des tableaux pour différents objets de régression. Un tel exemple est le code memisc lme4 montré dans la question. Il peut être judicieux de démarrer un référentiel github pour collecter de tels extraits de code, et au fil du temps, peut-être même l'ajouter au package memisc. N'importe quels preneurs?

Ramnath
la source
18

Le package stargazer est une autre bonne option. Il prend en charge les objets de nombreuses fonctions et packages couramment utilisés (lm, glm, svyreg, survival, pscl, AER), ainsi que de zelig. En plus des tableaux de régression, il peut également générer des statistiques récapitulatives pour les trames de données, ou générer directement le contenu des trames de données.

user1953965
la source
15

J'ai quelques trucs et astuces pour trouver des «fonctionnalités» intéressantes de xtable et Latex que je partagerai ici.

Astuce n ° 1: Suppression des doublons dans les colonnes et astuce n ° 2: Utilisation de Booktabs

Tout d'abord, chargez les packages et définissez ma fonction propre

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

Générez maintenant de fausses données

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

Nous pouvons maintenant générer un tableau et utiliser la fonction de nettoyage pour supprimer les entrées en double dans les colonnes d'étiquettes.

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

c'est une table xt normale

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

ceci est une table xt normale où une fonction personnalisée a transformé les doublons en NA

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

Ce tableau utilise le package booktab (et a besoin d'un \ usepackage {booktabs} dans les en-têtes)

\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
la source
12

Deux utilitaires du package taRifx peuvent être utilisés de concert pour produire des tableaux à plusieurs lignes d'héritarchies imbriquées.

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

exemple de sortie de table

Ari B. Friedman
la source
2
Existe-t-il un moyen de faire une chose similaire mais avec une trame de données entière au lieu d'un seul vecteur comme c'est le cas avec bytable ()?
Thraupidae
5

... et Trick # 3 Entrées multilignes dans un Xtable

Générez encore plus de données

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

Maintenant, produisez notre table xtable, en utilisant la fonction sanitize pour remplacer les noms de colonnes par les commandes de retour à la ligne Latex correctes (y compris les doubles barres obliques inverses pour que R soit satisfait)

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

(bien que ce ne soit pas parfait, car nous avons besoin de \ tabularnewline pour que le tableau soit formaté correctement, et Xtable place toujours un \ final, nous nous retrouvons donc avec une ligne vierge sous l'en-tête du tableau.)

PaulHurleyuk
la source
5

Vous pouvez également utiliser la fonction Latextable du package R micsFuncs:

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

Latextable (M) où M est une matrice avec des entrées alphabétiques et numériques mixtes génère un tableau LaTeX de base à l'écran, qui peut être copié et collé dans un document LaTeX. Lorsqu'il y a de petits nombres, il les remplace également par une notation d'index (par exemple 1,2x10 ^ {- 3}).

Benjamin Taylor
la source
5

Un autre package R pour agréger plusieurs modèles de régression dans des tables LaTeX est texreg .

Philip Leifeld
la source