Cómo imprimir (en papel) un marco de datos con un formato agradable

80

Me gustaría imprimir en papel marcos de datos con un formato agradable, idealmente desde un script. (Estoy tratando de recopilar datos usando un instrumento y procesarlos e imprimirlos automáticamente usando un script R).

Ahora mismo puedo escribir un marco de datos en un archivo de texto usando write.table(), pero esto tiene dos problemas:

  1. El archivo de texto resultante tiene un formato deficiente (las columnas no necesariamente se alinean con sus encabezados) y
  2. No sé cómo imprimir un archivo de texto desde R.

Estoy buscando más estrategias generales que código específico (¡aunque el código también sería genial!). ¿Sería Sweave la solución más conveniente? En principio, ¿puedo usarlo socketConnection()para imprimir en una impresora? Si es así, ¿dónde puedo aprender cómo usarlo? (No encontré la documentación muy útil).

Drew Steen
fuente
¿Estamos hablando de MS Word, supongo o es un papel LaTeX?
Tyler Rinker
¿Tiene LaTeX instalado en su computadora? Estoy pensando en una combinación de xtable, sweave (o knitr), y posiblemente esto: livedocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/… podría ayudar. Pero eso parece un poco complejo. Estoy interesado en ver qué se les ocurre a otros para esto.
Dason
En realidad, no quiero colocar el marco de datos en un documento más grande; solo quiero tener una hoja de papel impresa con un marco de datos legible, que luego colocaré en mi cuaderno de laboratorio como un registro en papel del salida del instrumento.
Drew Steen
No tengo LaTeX instalado en la máquina, pero supongo que puedo hacerlo con bastante facilidad.
Drew Steen
1
% System(lpr [filename]), al menos en el mundo * nix, puede permitirle encender la impresora desde R.
Carl Witthoft

Respuestas:

107

Aquí hay una posibilidad rápida y fácil de usar grid.tabledesde el paquete gridExtra:

library(gridExtra)
pdf("data_output.pdf", height=11, width=8.5)
grid.table(mtcars)
dev.off()

ingrese la descripción de la imagen aquí

Si sus datos no caben en la página, puede reducir el tamaño del texto grid.table(mtcars, gp=gpar(fontsize=8)). Esto puede no ser muy flexible, ni fácil de generalizar o automatizar.

bdemarest
fuente
@bdemarest, ¿cómo le pone un título a este gráfico en pdf?
user1471980
@ user1471980, una forma de hacerlo es grid.arrange(tableGrob(mtcars, gp=gpar(fontsize=6)), main="Main Title Here.").
bdemarest
¿Hay alguna forma de imprimir un marco de datos con una gran cantidad de filas que no caben en una sola página?
Nanami
10
@Nanami, prueba algo como esto:library(gridExtra); maxrow = 30; npages = ceiling(nrow(iris)/maxrow); pdf("iris_pages.pdf", height=11, width=8.5); for (i in 1:npages) {idx = seq(1+((i-1)*maxrow), i*maxrow); grid.newpage(); grid.table(iris[idx, ])}; dev.off()
bdemarest
1
@Masi, mtcarsse incluye en el datasetspaquete en una instalación R estándar. Se carga de forma predeterminada cuando inicia una nueva sesión de R. Intente escribir ?mtcarsy mtcarsen el indicador R para ver a qué me refiero.
bdemarest
16

Sugeriría xtableen combinación con documentos LaTeX. Eche un vistazo a los ejemplos en este pdf:

También puede combinar esto directamente con Sweaveo knitr.

smu
fuente
5
Por favor, ningún enlace solo responde. Sería genial tener un ejemplo de código mínimo con datos reproducibles y salida de ejemplo.
Léo Léopold Hertz 준영
Creo que la crítica debería haber sido dirigida al interrogador. No ofreció un ejemplo mínimo reproducible . La justificación habitual para no aceptar respuestas de solo enlace no parece aplicarse aquí. Esta pregunta tiene 7 años y el vínculo a una viñeta ubicada en CRAN parece bastante estable.
IRTFM
9

Sorprendido, nadie ha mencionado el stargazerpaquete para una buena impresión de datos.

Puede generar un archivo de texto atractivo:

stargazer(mtcars, type = 'text', out = 'out.txt')

============================================
Statistic N   Mean   St. Dev.  Min     Max  
--------------------------------------------
mpg       32 20.091   6.027   10.400 33.900 
cyl       32  6.188   1.786     4       8   
disp      32 230.722 123.939  71.100 472.000
hp        32 146.688  68.563    52     335  
drat      32  3.597   0.535   2.760   4.930 
wt        32  3.217   0.978   1.513   5.424 
qsec      32 17.849   1.787   14.500 22.900 
vs        32  0.438   0.504     0       1   
am        32  0.406   0.499     0       1   
gear      32  3.688   0.738     3       5   
carb      32  2.812   1.615     1       8   
--------------------------------------------

O incluso HTML:

stargazer(mtcars, type = 'html', out = 'out.html')

<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Statistic</td><td>N</td><td>Mean</td><td>St. Dev.</td><td>Min</td><td>Max</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">mpg</td><td>32</td><td>20.091</td><td>6.027</td><td>10.400</td><td>33.900</td></tr>
<tr><td style="text-align:left">cyl</td><td>32</td><td>6.188</td><td>1.786</td><td>4</td><td>8</td></tr>
<tr><td style="text-align:left">disp</td><td>32</td><td>230.722</td><td>123.939</td><td>71.100</td><td>472.000</td></tr>
<tr><td style="text-align:left">hp</td><td>32</td><td>146.688</td><td>68.563</td><td>52</td><td>335</td></tr>
<tr><td style="text-align:left">drat</td><td>32</td><td>3.597</td><td>0.535</td><td>2.760</td><td>4.930</td></tr>
<tr><td style="text-align:left">wt</td><td>32</td><td>3.217</td><td>0.978</td><td>1.513</td><td>5.424</td></tr>
<tr><td style="text-align:left">qsec</td><td>32</td><td>17.849</td><td>1.787</td><td>14.500</td><td>22.900</td></tr>
<tr><td style="text-align:left">vs</td><td>32</td><td>0.438</td><td>0.504</td><td>0</td><td>1</td></tr>
<tr><td style="text-align:left">am</td><td>32</td><td>0.406</td><td>0.499</td><td>0</td><td>1</td></tr>
<tr><td style="text-align:left">gear</td><td>32</td><td>3.688</td><td>0.738</td><td>3</td><td>5</td></tr>
<tr><td style="text-align:left">carb</td><td>32</td><td>2.812</td><td>1.615</td><td>1</td><td>8</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr></table>

BLT
fuente
7

El printrpaquete es una buena opción para imprimir data.frames, páginas de ayuda, listas de viñetas y listas de conjuntos de datos en documentos de Knitr .

Desde la página de documentación :

options(digits = 4)
set.seed(123)
x = matrix(rnorm(40), 5)
dimnames(x) = list(NULL, head(LETTERS, ncol(x)))
knitr::kable(x, digits = 2, caption = "A table produced by printr.")
jsta
fuente
1
Descubrí que esta es la mejor opción entre todas las respuestas, si está buscando imprimir un marco de datos en un pdf producido por Knitr.
snd
6

La solución grid.table será de hecho la forma más rápida de crear PDF, pero puede que no sea la solución óptima si tiene una tabla bastante larga. RStudio + knitr + longtable facilitan la creación de archivos PDF con un formato agradable. Lo que necesitará es algo como:

\documentclass{article}
\usepackage{longtable}
\begin{document}

<<results='asis'>>=
library(xtable)

df = data.frame(matrix(rnorm(400), nrow=100))
xt = xtable(df)
print(xt, 
      tabular.environment = "longtable",
      floating = FALSE
      )
@
\end{document}

Consulte esta publicación para obtener más detalles.

Así
fuente
Esta respuesta sería mucho mejor con un mínimo de ejemplos de datos y resultados. Ahora, lo siento como una respuesta corta.
Léo Léopold Hertz 준영
5

Para mesas largas / anchas , puede usar pander .

Automáticamente dividirá tablas largas en partes más cortas que se ajusten a la página, por ejemplo, usando knitr inserte este fragmento en su archivo Rmd:

pander::pander(mtcars)

ingrese la descripción de la imagen aquí

Si desea algo que se parezca más a tablas de Excel (incluso con opciones de edición en html), use rhandsontable . Más información sobre el uso y el formato en la viñeta . Necesitarás tejer tu Rmd en un archivo html:

library(rhandsontable)
rhandsontable(mtcars, rowHeaders = NULL)

ingrese la descripción de la imagen aquí

epo3
fuente
4

No tan elegante, pero muy utilitario:

print.data.frame(iris)
jclouse
fuente
1
Eso lo muestra en la pantalla, pero no muestra cómo hacerlo luego en papel.
Brian Diggs
4

El IDE de RStudio ofrece otra buena opción para imprimir una tabla de datos:

  1. Abra los datos en el visor, por ejemplo, View(data_table)oa través de la GUI
  2. Abra la vista en una ventana separada (icono en la esquina superior izquierda: "Mostrar en nueva ventana")
  3. La ventana separada ahora admite un cuadro de diálogo de impresión (incluida la vista previa)

Esto funciona en RStudio V0.98.1103 (y probablemente versiones más nuevas)

iglesia
fuente
Parece que el diálogo de impresión para ventanas separadas se ha ido con RStudio V0.99.
kirk
1
Aún puede obtenerlo haciendo clic con el botón derecho en la vista y seleccionando "Abrir marco" (v0.99.887).
MPE
2

Me encontré con esta pregunta cuando buscaba hacer algo similar. Encontré una mención del comando sink en otra parte de stackoverflow que fue útil en este contexto:

sink('myfile.txt')
print(mytable,right=F)
sink()
JamesF
fuente
0

Si desea exportar como png, puede hacer lo siguiente:

library(gridExtra)
png("test.png", height = 50*nrow(df), width = 200*ncol(df))
grid.table(df)
dev.off()

Si desea exportar como pdf, puede hacer lo siguiente:

library(gridExtra)
pdf("test.pdf", height=11, width=10)
grid.table(df)
dev.off()
Ning
fuente