Как распечатать (на бумаге) красиво отформатированный фрейм данных

80

Я хотел бы напечатать красиво отформатированные фреймы данных на бумаге, в идеале из сценария. (Я пытаюсь собрать данные с помощью инструмента и автоматически обработать и распечатать их с помощью сценария R).

Прямо сейчас я могу записать фрейм данных в текстовый файл, используя write.table(), но здесь есть две проблемы:

  1. Полученный текстовый файл плохо отформатирован (столбцы не обязательно совпадают с заголовками) и
  2. Я не знаю, как распечатать текстовый файл из R.

Я ищу больше общих стратегий, чем конкретного кода (хотя код тоже подойдет!). Будет ли Sweave самым удобным решением? В принципе, могу ли я использовать его socketConnection()для печати на принтере - и если да, то где я могу узнать, как его использовать (я не нашел документацию очень полезной).

Дрю Стин
источник
Мы говорим о MS Word, я полагаю, или это статья о LaTeX?
Тайлер Ринкер
Установлен ли на вашем компьютере LaTeX? Я думаю, что может помочь комбинация xtable, sweave (или knitr) и, возможно, это: livingocs.adobe.com/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/… . Но это кажется немного сложным. Мне интересно посмотреть, что другие придумывают для этого.
Дейсон
На самом деле я не хочу помещать фрейм данных в более крупный документ - я просто хочу иметь распечатанный лист бумаги с разборчивым фреймом данных, который я затем помещу в свою лабораторную записную книжку в качестве печатной копии записи инструментальный выход.
Дрю Стин
У меня на машине не установлен LaTeX, но я полагаю, что могу сделать это достаточно легко.
Дрю Стин,
1
% System(lpr [filename]), по крайней мере, в мире * nix, вы можете запустить принтер изнутри R.
Карл Уиттофт,

Ответы:

107

Вот быстрая и простая возможность использования grid.tableиз пакета gridExtra:

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

введите описание изображения здесь

Если ваши данные не помещаются на странице, вы можете уменьшить размер текста grid.table(mtcars, gp=gpar(fontsize=8)). Это может быть не очень гибким, и его нельзя будет легко обобщать или автоматизировать.

Bdemarest
источник
@bdemarest, как поставить заголовок на этот график в pdf?
user1471980
@ user1471980, один из способов сделать это grid.arrange(tableGrob(mtcars, gp=gpar(fontsize=6)), main="Main Title Here.").
bdemarest
Есть ли способ распечатать фрейм данных с очень большим количеством строк, которые не помещаются только на одной странице?
Nanami
10
@Nanami, попробуй что-нибудь вроде этого: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 mtcarsвходит в datasetsстандартную установку R. Он загружается по умолчанию при запуске нового сеанса R. Попробуйте ввести ?mtcarsи mtcarsв строке R, чтобы понять, что я имею в виду.
bdemarest
16

Я бы предложил xtableв сочетании с документами LaTeX. Взгляните на примеры в этом pdf:

Вы также можете напрямую комбинировать это с Sweaveили knitr.

smu
источник
5
Пожалуйста, без ссылки, только ответ. Было бы здорово иметь минимальный пример кода с воспроизводимыми данными и выходными данными.
Лео Леопольд Герц 준영
Я думаю, что критика должна быть направлена ​​в адрес вопрошающего. Он не привел минимально воспроизводимого примера . Обычное оправдание отказа от ответов только по ссылкам, похоже, здесь не применимо. Этому вопросу 7 лет, и ссылка на виньетку, размещенную на CRAN, кажется довольно стабильной.
IRTFM
9

Удивлен, что никто не упомянул 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>

BLT
источник
7

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.")
jsta
источник
1
Я обнаружил, что это лучший вариант среди всех ответов, если вы хотите распечатать фрейм данных в PDF-файле, созданном Knitr.
snd
6

Решение 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}

Пожалуйста, смотрите этот пост для получения более подробной информации.

Соси
источник
Этот ответ был бы намного лучше с минимальным количеством примеров данных и вывода. Теперь я считаю это загадочным ответом.
Лео Леопольд Герц 준영
5

Для длинных / широких столов вы можете использовать pander .

Он автоматически разделит длинные таблицы на более короткие части, которые соответствуют странице, например, с помощью knitr вставьте этот фрагмент в ваш файл Rmd:

pander::pander(mtcars)

введите описание изображения здесь

Если вам нужно что-то, что больше похоже на таблицы Excel (даже с параметрами редактирования в html), используйте rhandsontable . Подробнее об использовании и форматировании в виньетке . Вам нужно будет связать свой Rmd в файл html:

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

введите описание изображения здесь

эпо3
источник
4

Не так нарядно, но очень утилитарно:

print.data.frame(iris)
jclouse
источник
1
Это выводит это на экран, но не показывает, как перенести это на бумагу.
Брайан Диггс,
4

RStudio IDE дает еще один хороший вариант , чтобы распечатать data.table:

  1. Откройте данные в средстве просмотра, например, View(data_table)или через графический интерфейс.
  2. Открыть представление в отдельном окне (значок в верхнем левом углу: «Показать в новом окне»)
  3. Отдельное окно теперь поддерживает диалог печати (включая предварительный просмотр).

Это работает в RStudio V0.98.1103 (и, возможно, в более новых версиях)

Кирк
источник
Похоже, что диалоговое окно печати для отдельных окон исчезло с RStudio V0.99.
Кирк
1
Вы все еще можете получить его, щелкнув вид правой кнопкой мыши и выбрав «Открыть фрейм» (v0.99.887).
mpe
2

Я столкнулся с этим вопросом, когда хотел сделать что-то подобное. Я нашел упоминание о команде приемника в другом месте в stackoverflow, которое было полезно в этом контексте:

sink('myfile.txt')
print(mytable,right=F)
sink()
JamesF
источник
0

Если вы хотите экспортировать как 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()
Нин
источник