Drucken (auf Papier) eines gut formatierten Datenrahmens

78

Ich möchte schön formatierte Datenrahmen auf Papier drucken, idealerweise aus einem Skript heraus. (Ich versuche, Daten mit einem Instrument zu sammeln und sie automatisch mit einem R-Skript zu verarbeiten und zu drucken.)

Im Moment kann ich einen Datenrahmen mit in eine Textdatei schreiben write.table(), aber das hat zwei Probleme:

  1. Die resultierende Textdatei ist schlecht formatiert (Spalten müssen nicht unbedingt mit ihren Überschriften übereinstimmen) und
  2. Ich weiß nicht, wie ich eine Textdatei in R drucken soll.

Ich suche mehr nach allgemeinen Strategien als nach spezifischem Code (obwohl Code auch großartig wäre!). Wäre Sweave die bequemste Lösung? Im Prinzip kann ich socketConnection()auf einem Drucker drucken - und wenn ja, wo kann ich lernen, wie man es verwendet (ich fand die Dokumentation nicht sehr hilfreich).

Drew Steen
quelle
Sprechen wir vermutlich über MS Word oder handelt es sich um ein LaTeX-Papier?
Tyler Rinker
Haben Sie LaTeX auf Ihrem Computer installiert? Ich denke, eine Kombination aus xtable, sweave (oder knitr) und möglicherweise folgendem: livingocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/… könnte helfen. Das scheint aber etwas komplex zu sein. Ich bin daran interessiert zu sehen, was andere sich dafür einfallen lassen.
Dason
Ich möchte den Datenrahmen eigentlich nicht in ein größeres Dokument einfügen - ich möchte nur ein ausgedrucktes Stück Papier mit einem lesbaren Datenrahmen haben, das ich dann als gedruckte Aufzeichnung des in mein Labornotizbuch lege Instrumentenausgang.
Drew Steen
Ich habe LaTeX nicht auf dem Computer installiert, aber ich kann es wahrscheinlich leicht genug tun.
Drew Steen
1
% System(lpr [filename])Zumindest in der * nix-Welt können Sie den Drucker von R.
Carl Witthoft

Antworten:

107

Hier ist eine schnelle und einfache Möglichkeit, grid.tabledas GridExtra-Paket zu verwenden:

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

Geben Sie hier die Bildbeschreibung ein

Wenn Ihre Daten nicht auf die Seite passen, können Sie die Textgröße reduzieren grid.table(mtcars, gp=gpar(fontsize=8)). Dies ist möglicherweise nicht sehr flexibel und auch nicht einfach zu verallgemeinern oder zu automatisieren.

bdemarest
quelle
@bdemarest, wie fügt man diesem Diagramm einen Titel im PDF-Format hinzu?
user1471980
@ user1471980, Eine Möglichkeit, dies zu tun, ist grid.arrange(tableGrob(mtcars, gp=gpar(fontsize=6)), main="Main Title Here.").
bdemarest
Gibt es eine Möglichkeit, einen Datenrahmen mit einer sehr großen Anzahl von Zeilen zu drucken, die nicht auf nur eine Seite passen?
Nanami
10
@ Nanami, versuchen Sie so etwas: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 mtcarsist datasetsin einer Standard-R-Installation im Paket enthalten . Es wird standardmäßig geladen, wenn Sie eine neue R-Sitzung starten. Versuchen Sie tippen ?mtcarsund mtcarsan der R - Eingabeaufforderung , um zu sehen , was ich meine.
bdemarest
16

Ich würde xtablein Kombination mit LaTeX-Dokumenten vorschlagen . Schauen Sie sich die Beispiele in diesem PDF an:

Sie können dies auch direkt mit Sweaveoder kombinieren knitr.

smu
quelle
5
Bitte kein Link nur antworten. Es wäre großartig, ein minimales Codebeispiel mit reproduzierbaren Daten und Beispielausgaben zu haben.
Léo Léopold Hertz 준영
Ich denke, die Kritik hätte sich an den Fragesteller richten sollen. Er bot kein minimal reproduzierbares Beispiel . Die übliche Rechtfertigung, Antworten nur auf Links nicht zu akzeptieren, scheint hier nicht zuzutreffen. Diese Frage ist 7 Jahre alt und der Link zu einer CRAN-Vignette scheint ziemlich stabil zu sein.
IRTFM
9

Überrascht hat niemand das stargazerPaket zum schönen Drucken von Daten erwähnt.

Sie können eine gut aussehende Textdatei ausgeben:

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

Oder sogar 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
quelle
7

Das printrPaket ist eine gute Option zum Drucken data.frames, für Hilfeseiten, Vignettenlisten und Datensatzlisten in Knitr- Dokumenten.

Von der Dokumentationsseite :

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
quelle
1
Ich habe festgestellt, dass dies die beste Option unter allen Antworten ist, wenn Sie einen Datenrahmen in einem von Knitr erstellten PDF drucken möchten.
snd
6

Die grid.table-Lösung ist zwar der schnellste Weg, um PDF-Dateien zu erstellen. Dies ist jedoch möglicherweise nicht die optimale Lösung, wenn Sie eine ziemlich lange Tabelle haben. Mit RStudio + knitr + longtable können Sie ganz einfach gut formatierte PDFs erstellen. Was Sie brauchen, ist so etwas wie:

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

Bitte sehen Sie diesen Beitrag für weitere Details.

Thusi
quelle
Diese Antwort wäre mit einem minimalen Beispiel für Daten und Ausgabe viel besser. Jetzt empfinde ich es als eine Stichantwort.
Léo Léopold Hertz 준영
4

Nicht so schick, aber sehr nützlich:

print.data.frame(iris)
jclouse
quelle
1
Das bringt es auf den Bildschirm, zeigt aber nicht, wie man das dann auf Papier bringt.
Brian Diggs
4

Die RStudio-IDE bietet eine weitere nützliche Option zum Ausdrucken einer Datentabelle:

  1. Öffnen Sie die Daten im Viewer, zB View(data_table)oder über die GUI
  2. Öffnen Sie die Ansicht in einem separaten Fenster (Symbol in der oberen linken Ecke: "In neuem Fenster anzeigen")
  3. Das separate Fenster unterstützt jetzt einen Druckdialog (inkl. Vorschau)

Dies funktioniert in RStudio V0.98.1103 (und wahrscheinlich neueren Versionen)

Kirche
quelle
Es sieht so aus, als wäre der Druckdialog für separate Fenster mit RStudio V0.99 weg.
Kirk
1
Sie können es weiterhin erhalten, indem Sie mit der rechten Maustaste auf die Ansicht klicken und "Open Frame" (v0.99.887) auswählen.
Mpe
4

Für lange / breite Tische können Sie Pander verwenden .

Lange Tabellen werden automatisch in kürzere Teile aufgeteilt, die zur Seite passen, z. B. mit knitr diesen Teil in Ihre Rmd-Datei einfügen:

pander::pander(mtcars)

Geben Sie hier die Bildbeschreibung ein

Wenn Sie etwas möchten, das eher wie Excel-Tabellen aussieht (auch mit Bearbeitungsoptionen in HTML), verwenden Sie rhandsontable . Weitere Informationen zur Verwendung und Formatierung in der Vignette . Sie müssen Ihren Rmd in eine HTML-Datei stricken:

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

Geben Sie hier die Bildbeschreibung ein

epo3
quelle
2

Ich bin auf diese Frage gestoßen, als ich etwas Ähnliches tun wollte. Ich fand eine Erwähnung des Befehls sink an anderer Stelle im Stapelüberlauf, die in diesem Zusammenhang nützlich war:

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

Wenn Sie als PNG exportieren möchten, können Sie Folgendes tun:

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

Wenn Sie als PDF exportieren möchten, können Sie Folgendes tun:

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