Генерация вывода LaTeX из фрейма данных R - PullRequest
17 голосов
/ 14 февраля 2012

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

Я хотел бы вывести эту «таблицу» в виде файла .tex, чтобы я мог создать качество «академической публикации»стол, для печати.Я слышал о Sweave (и читал некоторые обзорные документы о Sweave) - так что я думаю, что это способ продолжить.Однако, сказав, что я на самом деле не видел пример, где Sweave выводит фрейм данных в виде текстового файла - все примеры Sweave, которые я видел до сих пор, кажутся надуманными, а не то, на чем я могу опираться.

Есть ли какие-то рекомендации, которым я могу следовать, чтобы вывести текс из данных?Кроме того, будет ли проще (более простым), если я построю строку TeX непосредственно из моего R-скрипта и сохраню строку в файл?(Мне не ясно, что Sweave предлагает сверх того, что вручную строит строку TeX «вручную»).

Ответы [ 4 ]

28 голосов
/ 14 февраля 2012

В пакете xtable есть несколько примеров того, как генерировать таблицы - см. Виньетка. Когда вы пишете чанк, убедитесь, что вы установили чанк на <<results=tex>>. См. Пример Sweave , например, this .

Вот так я бы вывел data.frame.

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

И необработанный результат будет выглядеть примерно так:

> 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}
17 голосов
/ 14 февраля 2012

Я часто использую latex и describe функции из пакета Hmisc, которые позволяют выполнять тонкую настройку.

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
4 голосов
/ 14 февраля 2012

Лично мне нравится управлять всем своим кодом изнутри R, а не из файла Rnw, когда я выводю сводные таблицы и не пишу отчет, используя cat() и sink(), это позволяет вам работать из текущегосреды, а не заставлять все загружаться и перезагружаться каждый раз, когда вам нужно перезапустить документ.Кроме того, это немного упрощает использование R для «дублирования», «вставки» или «прохождения» через большие объемы данных или списки данных.Однако следует отметить, что это несколько нарушает идею воспроизводимых исследований.

Вот пример того, что я бы поместил в R-файл (помня, конечно, что \ нужно экранировать \:

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")
0 голосов
/ 24 января 2019

Лучшее решение, которое я нашел, - это пакет Rtable xtable. Вы можете очень легко создать файл в формате LaTeX, который

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
y <- c(10, 20, 30, 40, 50, 60, 70, 80, 90)
df <- data.frame("x"=x, "y"=y)
print.xtable(xtable(head(df)), file = "./Data.txt")

Затем вы можете добавить содержимое «Data.txt» в ваш файл LaTeX с помощью

\input{./Data.txt}

Более быстрое и грязное решение, которое просто перенаправляет вывод текста, который обычно выводится на консоль, выглядит следующим образом:

sink("./Output.txt")
head(data)
sink()

Вы также можете использовать cat () для добавления отдельных комментариев

...