2012-02-14 14 views
14

Sto eseguendo R v2.14.1 su Ubuntu. Sto scrivendo uno script che genererà un frame di dati, che rappresenta una tabella di risultati.Generazione di output LaTeX dal frame di dati R

Vorrei produrre questa 'tabella' come file .tex in modo da poter creare una tabella di qualità 'pubblicazione accademica', per la stampa. Ho sentito parlare di Sweave (e di alcuni documenti di sintesi su Sweave), quindi penso che questo sia il modo di procedere. Tuttavia, avendo detto che in realtà non ho visto un esempio in cui Sweave emette un dataframe come file tex, tutti gli esempi di Sweave che ho visto fino ad ora, sembrano inventati e non qualcosa su cui posso costruire.

Ci sono delle linee guida che posso seguire per emettere tex da un dataframe? Inoltre, sarà più semplice (più diretto), se ho costruito la stringa TeX direttamente dal mio script R e salvato la stringa in un file? (Non è chiaro per me, cosa offre Sweave oltre a costruire manualmente manualmente la stringa TeX "manualmente").

+0

controllare anche knitr E 'in fase di sviluppo attivo e ha una maggiore flessibilità rispetto Sweave. –

risposta

22

Il pacchetto xtable contiene alcuni esempi su come generare tabelle: vedere la vignetta. Quando scrivi un chunk, assicurati di impostare il chunk su <<results=tex>>. Vedere Sweave example, ad esempio, this.

Ecco come vorrei produrre un data.frame.

<<results=tex>> 
    xtable(my.data.frame) 
@ 

E il risultato grezzo sarebbe simile a questa:

> xtable(my.data.frame) 
% latex table generated in R 2.14.1 by xtable 1.6-0 package 
% Tue Feb 14 10:03:03 2012 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rllr} 
    \hline 
& p & q & r \\ 
    \hline 
1 & condition\_a & grp\_1 & 3 \\ 
    2 & condition\_a & grp\_1 & 3 \\ 
    3 & condition\_a & grp\_1 & 4 \\ 
    4 & condition\_a & grp\_1 & 1 \\ 
    5 & condition\_b & grp\_1 & 4 \\ 
    6 & condition\_b & grp\_1 & 3 \\ 
    7 & condition\_b & grp\_1 & 5 \\ 
    8 & condition\_b & grp\_1 & 5 \\ 
    9 & condition\_a & grp\_2 & 4 \\ 
    10 & condition\_a & grp\_2 & 1 \\ 
    11 & condition\_a & grp\_2 & 1 \\ 
    12 & condition\_a & grp\_2 & 1 \\ 
    13 & condition\_b & grp\_2 & 5 \\ 
    14 & condition\_b & grp\_2 & 1 \\ 
    15 & condition\_b & grp\_2 & 5 \\ 
    16 & condition\_b & grp\_2 & 2 \\ 
    \hline 
\end{tabular} 
\end{center} 
\end{table} 
+0

Penso che il '=' sia mancante nel codice Sweave? '<> =' – elevendollar

+0

Sto provando ad applicare questa proposta qui https://unix.stackexchange.com/q/366637/16920 –

15

Io uso spesso le latex e describe funzioni dal pacchetto Hmisc, che permettono un sacco di messa a punto.

library(Hmisc) 
d <- data.frame(a=LETTERS[1:5], x=rnorm(5)) 
latex(d, file="")   # If you want all the data 
latex(describe(d), file="") # If you just want a summary 
+0

+1 per approccio interessante. Sarò sicuro di provare anche questo ad un certo punto. –

4

Personalmente, mi piace gestire tutto il mio codice dall'interno R, piuttosto che un file Rnw quando sto output tabelle di riepilogo e non scrivere una relazione, utilizzando cat() e sink() questo permette di lavorare all'interno della corrente ambiente piuttosto che forzare tutto da caricare e ricaricare ogni volta che è necessario rieseguire il documento. Inoltre, rende un po 'più facile usare R per "duplicare", "incollare" o "loop" attraverso grandi quantità di dati o liste di dati. Dovrebbe essere notato, tuttavia, che questo in qualche modo rompe l'idea di ricerca riproducibile.

Ecco un esempio di quello che avrei messo in un file di R (ricordando, naturalmente, che \ deve essere sfuggito \:.

dat <- list() 
for(i in 1:15) { 
    dat[[i]] <- sample(c("A","B"),1000,replace=TRUE) # Dummy data 
} 

sink("temp.Rnw") 

cat(" 
\\documentclass{article} 
\\usepackage{Sweave} 
\\begin{document} 
") 

# Print a lot of tables 
invisible(
    lapply(dat, 
     function(x) 
     print(xtable(table(x),caption=names(x)),table.placement="!htp")) 
) 

cat(" 
\\end{document} 
") 

sink() 
Sweave("temp.Rnw") 
compilePdf("temp.Rnw") 
Problemi correlati