Ferramentas para fazer tabelas de látex em R [fechado]

268

A pedido geral, um wiki da comunidade sobre a produção de tabelas de látex em R. Neste post, darei uma visão geral dos pacotes e blogs mais usados ​​com código para produzir tabelas de látex a partir de objetos menos diretos. Sinta-se à vontade para adicionar o que eu perdi e / ou dar dicas, sugestões e pequenos truques sobre como produzir tabelas de látex bem formatadas com R.

Pacotes:

  • xtable : para tabelas padrão da maioria dos objetos simples. Uma bela galeria com exemplos pode ser encontrada aqui .
  • memisc : ferramenta para gerenciamento de dados de pesquisa, contém algumas ferramentas para tabelas de látex de estimativas (básicas) de modelos de regressão.
  • Hmisc contém uma função latex()que cria um arquivo tex contendo o objeto de escolha. É bastante flexível e também pode gerarlongtable gerar tabelas de látex. Há muitas informações no arquivo de ajuda?latex
  • miscFuncs possui uma função elegante 'latextable' que converte dados da matriz com entradas alfabéticas e numéricas misturadas em uma tabela LaTeX e as imprime no console, para que possam ser copiadas e coladas em um documento LaTeX.
  • pacote texreg ( papel JSS ) converte a saída do modelo estatístico em tabelas LaTeX. Mescla vários modelos. Pode lidar com cerca de 50 tipos diferentes de modelos, incluindo modelos de rede e modelos multiníveis (lme e lme4).
  • pacote reporttools ( papel JSS ) é outra opção para estatísticas descritivas sobre variáveis ​​contínuas, categóricas e de data.
  • talvez o pacote de tabelas LaTeX mais geral em R para estatísticas descritivas
  • pacote stargazer faz boas tabelas de resumo comparativas do modelo estatístico

Blogs e trechos de código

Perguntas relacionadas :

Joris Meys
fonte
4
Em Validação cruzada (stats.SE), a seguinte postagem no blog será de interesse para os leitores aqui: Algumas notas sobre como criar tabelas eficazes .
gung - Reintegrar Monica
2
Você também pode usar o ztable. Faz tabelas com listras de zebra nos formatos LaTeX e HTML facilmente. É bastante flexível e simples: cran.r-project.org/web/packages/ztable/vignettes/ztable.html
skan
Qual é o "procedimento" sugerido para trabalhar com muitas tabelas no R (ou RStudio) e usá-las em um programa externo de látex, como o TexStudio, para incorporá-las em um projeto muito maior?
skan
1
@skan Isso é específico para o látex. Se você criar documentos "filhos", crie-os como documentos em látex e use includeou input. Você pode usar o writeLines()que funciona com ambos kable()e xtable(). Armazene como arquivos .tex e problema resolvido.
Joris Meys
1
OTOH, se você usa vários documentos e deseja combiná-los em um (você não tem certeza disso), cria os documentos e usa-os inputpara colocar um documento nos outros. O manual do látex informará que isso é o mesmo que digitar o conteúdo do documento naquele local; portanto, não há necessidade de copiar e colar toda a instalação que você fez no preâmbulo.
Joris Meys

Respostas:

22

Gostaria de adicionar uma menção ao pacote "fermentação". Você pode gravar um arquivo de modelo de distribuição que seria o LaTeX com espaços reservados e, em seguida, "distribuir" para criar um arquivo .tex para \ incluir ou \ entrada no seu LaTeX. Algo como:

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

A sintaxe de distribuição também pode manipular loops, para que você possa criar uma linha da tabela para cada linha de um quadro de dados.

Spacedman
fonte
O pacote R.rsp e sua função rstring () são semelhantes a brew :: brew (). Não tenho certeza se é melhor, mas o pacote certamente tem mais coisas. Em qualquer um dos casos, gosto dessa abordagem, pois oferece mais flexibilidade no código tex, sem sacrificar a reprodutibilidade.
Richard DiSalvo
21

Obrigado Joris por criar esta pergunta. Felizmente, isso será transformado em um wiki da comunidade.

Os pacotes de booktabs em látex produzem tabelas com boa aparência. Aqui está uma postagem de blog sobre como usar o xtable para criar tabelas de látex que usam guias de livros

Eu também adicionaria o apsrtablepacote ao mix, pois ele produz tabelas de regressão com boa aparência.

Outra idéia: Alguns desses pacotes (especialmente memisc e apsrtable) permitem extensões fáceis do código para produzir tabelas para diferentes objetos de regressão. Um exemplo é o código de memisc lme4 mostrado na pergunta. Pode fazer sentido iniciar um repositório do github para coletar esses trechos de código e, com o tempo, talvez até adicioná-lo ao pacote memisc. Algum comprador?

Ramnath
fonte
18

O pacote stargazer é outra boa opção. Ele suporta objetos de muitas funções e pacotes comumente usados ​​(lm, glm, svyreg, survival, pscl, AER), bem como do zelig. Além das tabelas de regressão, ele também pode gerar estatísticas resumidas para quadros de dados ou gerar diretamente o conteúdo dos quadros de dados.

user1953965
fonte
15

Eu tenho alguns truques e soluções alternativas interessantes para 'xtable' e 'Latex' que vou compartilhar aqui.

Truque # 1: Removendo Duplicatas em Colunas e Truque # 2: Usando Booktabs

Primeiro, carregue pacotes e defina minha função de limpeza

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

Agora gere alguns dados falsos

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

Agora podemos gerar uma tabela e usar a função clean para remover entradas duplicadas nas colunas do rótulo.

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

esta é uma tabela normal

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

esta é uma tabela normal em que uma função personalizada transformou duplicatas em NA

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

Esta tabela usa o pacote booktab (e precisa de um \ usepackage {booktabs} nos cabeçalhos)

\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
fonte
12

Dois utilitários no pacote taRifx podem ser usados ​​em conjunto para produzir tabelas de várias linhas de hierarquias aninhadas.

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

saída da tabela de amostra

Ari B. Friedman
fonte
2
Existe uma maneira de fazer uma coisa semelhante, mas com um quadro de dados inteiro em vez de apenas um vetor, como é inserido com bytable ()?
Thraupidae
5

... e Truque # 3 Entradas multilinhas em uma tabela X

Gere mais alguns dados

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

Agora produza nossa xtable, usando a função sanitize para substituir os nomes das colunas pelos comandos corretos de nova linha do Latex (incluindo barras invertidas duplas para que R fique feliz)

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

(embora isso não seja perfeito, pois precisamos de \ tabularnewline para que a tabela seja formatada corretamente e o Xtable ainda coloque um final \, então terminamos com uma linha em branco abaixo do cabeçalho da tabela.)

PaulHurleyuk
fonte
5

Você também pode usar a função latextable do pacote R micsFuncs:

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

latextable (M), em que M é uma matriz com entradas alfabéticas e numéricas misturadas, gera uma tabela básica do LaTeX na tela, que pode ser copiada e colada em um documento do LaTeX. Onde houver números pequenos, ele também os substituirá pela notação de índice (por exemplo, 1,2x10 ^ {- 3}).

Benjamin Taylor
fonte
5

Outro pacote R para agregar vários modelos de regressão em tabelas LaTeX é o texreg .

Philip Leifeld
fonte