web-dev-qa-db-fra.com

Outils pour la fabrication de tables en latex en R

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

Paquets :

  • xtable : pour les tables 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 quelques outils pour les tables au latex des 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 générer des tables longtable latex. Il y a beaucoup d'informations dans le fichier d'aide ?latex
  • miscFuncs a une fonction soignée'xtxtable 'qui convertit les données de la matrice avec des entrées mélangées alphabétiques et numériques dans une table LaTeX et les imprime dans la console, de sorte qu'elles puissent être copiées et collées dans un document LaTeX.
  • texreg package ( JSS paper ) convertit la sortie du modèle statistique en tables LaTeX. Fusionne plusieurs modèles. Peut prendre en charge environ 50 types de modèles différents, y compris les modèles de réseau et les modèles à plusieurs niveaux (Lme et Lme4).
  • reporttools package ( JSS paper ) est une autre option pour les statistiques descriptives sur les variables continues, catégorielles et à la date.
  • tables package est peut-être le package de création de tables LaTeX le plus général en R pour les statistiques descriptives
  • stargazer Un paquet permet de réaliser des tableaux récapitulatifs des modèles statistiques comparatifs de Nice

Blogues et extraits de code

Questions connexes :

269
Joris Meys

Je voudrais ajouter une mention du paquet "brasser". Vous pouvez écrire un fichier de modèle de brassage qui serait LaTeX avec des espaces réservés, puis "le préparer" pour créer un fichier .tex à\include ou\input 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 afin que vous puissiez créer une ligne de tableau pour chaque ligne d'un cadre de données.

22
Spacedman

Merci Joris d'avoir créé cette question. Espérons que cela deviendra un wiki de communauté.

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

J'ajouterais également le package apsrtable au mix car il produit des tables de régression attrayantes.

Une autre idée: Certains de ces packages (notamment memisc et apsrtable) permettent d’extraire facilement le code pour produire des tableaux pour différents objets de régression. Un exemple de ce type est le code memme lme4 indiqué dans la question. Il peut être judicieux de démarrer un référentiel github pour collecter de tels extraits de code et, éventuellement, de les ajouter éventuellement au paquet memisc. N'importe quels preneurs?

21
Ramnath

Le package stargazer est une autre bonne option. Il supporte les objets de nombreuses fonctions et packages couramment utilisés (lm, glm, svyreg, survie, pscl, AER), ainsi que de zelig. Outre les tables 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.

18
user1953965

J'ai quelques astuces et solutions autour des 'fonctionnalités' intéressantes d'xtable et de Latex que je vais partager ici.

Astuce n ° 1: Suppression des doublons dans les colonnes et Astuce n ° 2: Utilisation des listes de sélection

Tout d'abord, chargez les paquets et définissez ma fonction de nettoyage

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

Maintenant générer des données fausses

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 une table et utiliser la fonction de nettoyage pour supprimer les entrées en double dans les colonnes de l'étiquette.

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

c'est un xtable normal

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

c'est une xtable 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
    )
@ 

Cette table utilise le paquet booktab (et nécessite 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
@ 
15
PaulHurleyuk

Deux utilitaires du paquet taRifx peuvent être utilisés de concert pour produire des tables à plusieurs rangées de hiérarchies 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

sample table output

12
Ari B. Friedman

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 mixtes alphabétiques et numériques, génère un tableau LaTeX de base sur l'écran, qui peut être copié et collé dans un document LaTeX. Là où il y a de petits nombres, il les remplace également par la notation d'index (par exemple 1.2x10 ^ {- 3}).

5
Benjamin Taylor

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

5
Philip Leifeld

... et les astuces # 3 des entrées multilignes dans une Xtable

Générer 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, produisons notre xtable, en utilisant la fonction sanitize pour remplacer les noms de colonnes par les commandes de nouvelle ligne Latex appropriées (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 correctement formaté, et Xtable place toujours un\final, nous obtenons donc une ligne vide sous l'en-tête du tableau.)

5
PaulHurleyuk