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.
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
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.
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?
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.
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
@
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
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}).
Un autre package R permettant d'agréger plusieurs modèles de régression dans des tables LaTeX est texreg .
... 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.)