Как печатать (на бумаге) хорошо отформатированный фрейм данных
Я хотел бы печатать хорошо отформатированные фреймы данных на бумаге, в идеале, из script. (Я пытаюсь собрать данные с помощью инструмента и автоматически обрабатывать и печатать его с помощью R script).
Прямо сейчас я могу записать кадр данных в текстовый файл с помощью write.table()
, но это имеет две проблемы:
- Полученный текстовый файл плохо отформатирован (столбцы не обязательно совпадают с заголовками) и
- Я не знаю, как печатать текстовый файл из R.
Я ищу больше общих стратегий, чем для конкретного кода (хотя код тоже будет отличным!). Будет ли Sweave самым удобным решением? В принципе, я могу использовать socketConnection()
для печати на принтер - и если да, где я могу узнать о том, как его использовать (я не нашел документацию очень полезной).
Ответы
Ответ 1
Вот быстрая и простая возможность использовать grid.table
из пакета gridExtra:
library(gridExtra)
pdf("data_output.pdf", height=11, width=8.5)
grid.table(mtcars)
dev.off()
![enter image description here]()
Если ваши данные не помещаются на странице, вы можете уменьшить размер текста grid.table(mtcars, gp=gpar(fontsize=8))
. Это может быть не очень гибким, легким для обобщения или автоматизации.
Ответ 2
Я предлагаю xtable
в сочетании с документами LaTeX. Взгляните на примеры в этом pdf:
Вы также можете напрямую комбинировать это с Sweave
или knitr
.
Ответ 3
Решение grid.table действительно будет самым быстрым способом создания PDF, но это может быть не оптимальное решение, если у вас довольно длинная таблица. RStudio + knitr + longtable упрощает создание хорошо отформатированных PDF файлов. Вам понадобится что-то вроде:
\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}
Подробнее см. .
Ответ 4
Не как фантазия, а очень утилитарная:
print.data.frame(iris)
Ответ 5
Пакет printr
является хорошим вариантом для печати data.frames
, страниц справки, списков виньетки и списков набора данных в knitr.
На странице :
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.")
Ответ 6
Удивленный никто не упомянул пакет stargazer
для приятной печати данных.
Вы можете вывести красивый текстовый файл:
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
--------------------------------------------
Или даже 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>
Ответ 7
RStudio IDE дает еще один хороший вариант для печати таблицы данных.
- Откройте данные в средстве просмотра, например.
View(data_table)
или через графический интерфейс
- Открыть представление в отдельном окне (значок в левом верхнем углу: "Показать в новом окне" )
- В отдельном окне теперь поддерживается диалоговое окно печати (включая предварительный просмотр).
Это работает в RStudio V0.98.1103 (и, возможно, более поздних версиях)
Ответ 8
Я столкнулся с этим вопросом, когда хотел сделать что-то подобное. Я нашел упоминание команды раковины в другом месте в stackoverflow, которая была полезна в этом контексте:
sink('myfile.txt')
print(mytable,right=F)
sink()
Ответ 9
В длинных/широких таблицах вы можете использовать pander.
Он автоматически разделяет длинные таблицы на более короткие части, которые соответствуют странице, например. используя knitr вставьте этот фрагмент в ваш файл Rmd:
pander::pander(mtcars)
![введите описание изображения здесь]()
Если вы хотите что-то большее, чем таблицы Excel (даже с настройками редактирования в html), используйте rhandsontable. Подробнее об использовании и форматировании в vignette.
Вам нужно связать Rmd в html файле:
library(rhandsontable)
rhandsontable(mtcars, rowHeaders = NULL)
![введите описание изображения здесь]()
Ответ 10
Если вы хотите экспортировать как png, вы можете сделать вот так:
library(gridExtra)
png("test.png", height = 50*nrow(df), width = 200*ncol(df))
grid.table(df)
dev.off()
Если вы хотите экспортировать в формате pdf, вы можете сделать это следующим образом:
library(gridExtra)
pdf("test.pdf", height=11, width=10)
grid.table(df)
dev.off()