Генерация вывода LaTeX из фрейма данных R

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

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

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


person Homunculus Reticulli    schedule 14.02.2012    source источник
comment
также проверьте трикотаж. Он находится в активной разработке и обладает большей гибкостью, чем Sweave.   -  person Xu Wang    schedule 15.02.2012


Ответы (5)


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

Вот как я бы вывел 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}
person Roman Luštrik    schedule 14.02.2012
comment
Я думаю, что в коде Sweave отсутствует символ «=»? <<results=tex>>= - person elevendollar; 29.09.2016
comment
Я пытаюсь применить это предложение здесь unix.stackexchange.com/q/366637/16920. - person Léo Léopold Hertz 준영; 30.05.2017

Я часто использую 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
person Vincent Zoonekynd    schedule 14.02.2012
comment
+1 за интересный подход. Я обязательно попробую это тоже на каком-то этапе. - person Homunculus Reticulli; 14.02.2012

Используйте kable() из пакета knitr, чтобы превратить фрейм данных в таблицу LaTeX из R. < пакет href="https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf" rel="noreferrer">kableExtra позволяет выполнить более точную настройку.


# Toy example 
df <- tibble(x = c(1:3), 
             y = c(4:6))

# Plain latex output 
kable(df, "latex")

# With Booktabs 
kable(df, "latex", booktabs = TRUE)

person Jae    schedule 27.05.2020
comment
Криминально недооцененный ответ. Вероятно, более длинный пример с использованием функций kableExtra больше заинтересует будущих читателей. - person Álvaro A. Gutiérrez-Vargas; 16.01.2021

Лично мне нравится управлять всем своим кодом из 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")
person Brandon Bertelsen    schedule 14.02.2012

Лучшее решение, которое я нашел, — это пакет R 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() для добавления отдельных комментариев.

person MacNutter    schedule 24.01.2019