2012-02-14 31 views
14

Tôi đang chạy R v2.14.1 trên Ubuntu. Tôi đang viết một kịch bản sẽ tạo ra một khung dữ liệu, biểu diễn một bảng kết quả.Tạo đầu ra LaTeX từ khung dữ liệu R

Tôi muốn xuất 'bảng' này thành tệp .tex để tôi có thể tạo bảng chất lượng 'ấn phẩm học thuật' để in. Tôi đã nghe nói về Sweave (và đọc một số tài liệu tổng quan về Sweave) - vì vậy tôi nghĩ rằng đây là cách để bắt đầu. Tuy nhiên có nói rằng tôi đã không thực sự nhìn thấy một ví dụ nơi Sweave kết quả đầu ra một dataframe như một tập tin tex - tất cả các ví dụ Sweave tôi đã thấy cho đến nay, dường như contrived và không phải cái gì mà tôi có thể xây dựng trên.

Có một số nguyên tắc tôi có thể làm theo không, để xuất tex từ một khung dữ liệu? Ngoài ra, nó sẽ đơn giản hơn (thẳng hơn), nếu tôi xây dựng chuỗi TeX trực tiếp từ tập lệnh R của tôi và lưu chuỗi đó vào tệp? (Nó không rõ ràng với tôi, những gì Sweave cung cấp hơn và ở trên bằng tay xây dựng chuỗi TeX 'bằng tay').

+0

cũng kiểm tra knitr Nó đang được phát triển tích cực và có tính linh hoạt hơn Sweave –

Trả lời

22

Gói xtable có một số ví dụ về cách tạo bảng - xem họa tiết. Khi bạn đang viết một đoạn, hãy chắc chắn rằng bạn đã đặt đoạn thành <<results=tex>>. Xem Sweave example, ví dụ: this.

Đây là cách tôi sẽ xuất dữ liệu.frame.

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

Và kết quả thô sẽ trông giống như sau:

> 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} 
+0

Tôi nghĩ rằng '=' bị thiếu trong mã Sweave? '<> =' – elevendollar

+0

Tôi đang cố áp dụng đề xuất này tại đây https://unix.stackexchange.com/q/366637/16920 –

15

Tôi thường sử dụng latexdescribe chức năng từ gói Hmisc, cho phép rất nhiều tinh chỉnh.

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

+1 cho Tôi chắc chắn sẽ thử điều đó ở một số giai đoạn. –

4

Cá nhân, tôi thích quản lý tất cả mã của tôi từ bên trong R chứ không phải là một tập tin Rnw khi tôi xuất ra các bảng tóm tắt và không viết một báo cáo, bằng cách sử dụng cat()sink() này cho phép bạn làm việc từ bên trong hiện tại môi trường hơn là buộc tất cả mọi thứ được nạp và tải lại mọi lúc bạn cần chạy lại tài liệu. Ngoài ra, nó làm cho nó dễ dàng hơn một chút để sử dụng R để "trùng lặp", "dán" hoặc "vòng lặp" thông qua một lượng lớn dữ liệu hoặc danh sách dữ liệu. Cần lưu ý mặc dù, điều này phần nào phá vỡ ý tưởng của nghiên cứu tái sản xuất.

Dưới đây là một ví dụ về những gì tôi sẽ đặt trong một tập tin R (ghi nhớ, tất nhiên rằng \ cần phải được thoát \:.

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") 
Các vấn đề liên quan