2013-07-10 12 views
7

Tôi muốn kết hợp các bảng từ hai dataframes và muốn xuất bảng đó sang latex. Bảng mà tôi muốn tạo trông như sau. Lưu ý, bảng bên dưới được tạo bằng excel.Tạo một bảng trong R với tiêu đề mở rộng trên hai cột bằng cách sử dụng xtable hoặc bất kỳ gói nào

enter image description here

Từ xtable in R Tôi có thể xuất bảng cho hai trạm riêng lẻ. nhận được sau đây cho hai trạm T1 và T2. Làm thế nào tôi có thể kết hợp đầu ra của hai trạm để có được kết quả mong muốn như trên?

ga T1:

> stT1 
     Observed-modeled |observed-modeled| 
Min.   -1.5360000   0.0001891 
1st Qu.  0.0002512   0.1633000 
Median   0.3593000   0.5390000 
Mean   0.8554000   1.0020000 
3rd Qu.  1.6470000   1.6470000 
Max.   5.5370000   5.5370000 

> dput(stT1) 
structure(list(`Observed-modeled` = c(-1.536, 0.0002512, 0.3593, 
0.8554, 1.647, 5.537), `|observed-modeled|` = c(0.0001891, 0.1633, 
0.539, 1.002, 1.647, 5.537)), .Names = c("Observed-modeled", 
"|observed-modeled|"), row.names = c("Min.", "1st Qu.", "Median", 
"Mean", "3rd Qu.", "Max."), class = "data.frame") 

ga T2:

> stT2 
     Observed-modeled |observed-modeled| 
Min.    -2.3740   0.001259 
1st Qu.   -1.2280   0.674700 
Median   -0.6202   1.101000 
Mean    -0.2094   1.085000 
3rd Qu.   0.7418   1.413000 
Max.    5.0530   5.053000 

> dput(stT2) 
structure(list(`Observed-modeled` = c(-2.374, -1.228, -0.6202, 
-0.2094, 0.7418, 5.053), `|observed-modeled|` = c(0.001259, 0.6747, 
1.101, 1.085, 1.413, 5.053)), .Names = c("Observed-modeled", 
"|observed-modeled|"), row.names = c("Min.", "1st Qu.", "Median", 
"Mean", "3rd Qu.", "Max."), class = "data.frame") 

tôi kết hợp hai trạm như sau:

newstT <- cbind(stT1,stT2) 

> newstT 
     Observed-modeled |observed-modeled| Observed-modeled |observed-modeled| 
Min.   -1.5360000   0.0001891   -2.3740   0.001259 
1st Qu.  0.0002512   0.1633000   -1.2280   0.674700 
Median   0.3593000   0.5390000   -0.6202   1.101000 
Mean   0.8554000   1.0020000   -0.2094   1.085000 
3rd Qu.  1.6470000   1.6470000   0.7418   1.413000 
Max.   5.5370000   5.5370000   5.0530   5.053000 

tôi đã không thể để thêm trạm T1 và trạm T2 ở trên cùng như thể hiện trong hình mong muốn.

+1

Bạn có thể muốn xem' add.to.row' trong '? xtable'. – asb

Trả lời

5

Gói tables có cách tiếp cận khác để xây dựng bảng và có phương thức latex.tabular để xuất ra mủ có liên quan.

này sẽ làm việc tốt nhất nếu dữ liệu của bạn là ở dạng dài

library(tables) 

# rbind with rownames as a column 
st <- rbind(
    data.frame(stT1, station = 'T1', what = factor(rownames(stT1), levels = rownames(stT1)), 
      row.names= NULL, check.names = FALSE), 
    data.frame(stT2,station = 'T2',what = factor(rownames(stT2), levels = rownames(stT2)), 
      row.names = NULL,check.names = FALSE) 
    ) 


mytable <- tabular(Heading()*what ~ station*(`Observed-modeled` +`|observed-modeled|`)*Heading()*(identity),data=st) 
mytable                     
##   station                 
##   T1         T2         
##   Observed-modeled |observed-modeled| Observed-modeled |observed-modeled| 
## Min. -1.5360000  0.0001891   -2.3740   0.001259   
## 1st Qu. 0.0002512  0.1633000   -1.2280   0.674700   
## Median 0.3593000  0.5390000   -0.6202   1.101000   
## Mean  0.8554000  1.0020000   -0.2094   1.085000   
## 3rd Qu. 1.6470000  1.6470000   0.7418   1.413000   
## Max.  5.5370000  5.5370000   5.0530   5.053000 

là rất nhiều kiểm soát tốt bạn có hơn kết quả. Chúng được mô tả trong các vignette.

Trong ví dụ trên, bạn có thể thấy rằng Heading() sẽ chặn (hoặc thay đổi) tiêu đề cho cột trong khi identity là hàm được sử dụng để tóm tắt từng kết hợp.

Và để chứng minh rằng nó sẽ tạo ra các đối tượng bảng mủ thích hợp (với multicolumns)

latex(mytable) 


\begin{tabular}{lcccc} 
\hline 
& \multicolumn{4}{c}{station} \\ 
& \multicolumn{2}{c}{T1} & \multicolumn{2}{c}{T2} \\ 
    & Observed-modeled & |observed-modeled| & Observed-modeled & \multicolumn{1}{c}{|observed-modeled|} \\ 
\hline 
Min. & $-1.5360000$ & $0.0001891$ & $-2.3740$ & $0.001259$ \\ 
1st Qu. & $\phantom{-}0.0002512$ & $0.1633000$ & $-1.2280$ & $0.674700$ \\ 
Median & $\phantom{-}0.3593000$ & $0.5390000$ & $-0.6202$ & $1.101000$ \\ 
Mean & $\phantom{-}0.8554000$ & $1.0020000$ & $-0.2094$ & $1.085000$ \\ 
3rd Qu. & $\phantom{-}1.6470000$ & $1.6470000$ & $\phantom{-}0.7418$ & $1.413000$ \\ 
Max. & $\phantom{-}5.5370000$ & $5.5370000$ & $\phantom{-}5.0530$ & $5.053000$ \\ 
\hline 
\end{tabular} 

Như đã đề cập ở trên, bạn có thể loại bỏ bất kỳ tiêu đề cột bằng Heading()* cột trong câu hỏi

ví dụ để loại bỏ " trạm "từ hàng đầu tiên (làm tiêu đề cho tất cả các cột)

tabular(Heading()*what ~ Heading()*station*(`Observed-modeled` +`|observed-modeled|`)*Heading()*(identity),data=st) 
+0

Cảm ơn bạn rất nhiều vì đã chỉ đến gói bảng. Cách tiếp cận của bạn làm những gì tôi đang tìm kiếm. –

+0

Có thể loại bỏ 'trạm' ở hàng trên cùng không? Phần còn lại là hoàn hảo. Thay vì hai dòng 'station' và sau đó là' T1' và 'T2', tôi chỉ muốn' T1' và 'T2'. Tôi có thể tự xóa dòng trong mã latex, nhưng tôi đang sử dụng knitr và sẽ hữu ích nếu tôi có thể xóa bằng mã. –

+0

@Jdbaba - sử dụng 'Tiêu đề() * trạm' - xem câu trả lời đã chỉnh sửa. – mnel