2013-07-10 22 views
7

Voglio combinare le tabelle da due dataframes e voglio esportare quella tabella in latex. La tabella che voglio creare appare come segue. Nota, la tabella seguente viene creata usando excel.Creare una tabella in R con l'intestazione che si espande su due colonne utilizzando xtable o qualsiasi pacchetto

enter image description here

Da XTABLE in R sono stato in grado di esportare la tabella per due stazioni individuali. ottenere il seguente per due stazioni T1 e T2. Come posso combinare l'uscita di due stazioni per ottenere l'output desiderato come sopra?

Stazione 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") 

Stazione 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") 

ho unito due stazioni come segue:

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 

non ero in grado di aggiungere stazione di T1 e la stazione T2 in alto come mostrato nella figura desiderata.

+1

Si consiglia di guardare' add.to.row' in '? xtable'. – asb

risposta

5

Il pacchetto tables ha un approccio diverso alla costruzione di tabelle e dispone di un metodo latex.tabular per l'output del lattice pertinente.

Questo funziona meglio se i dati sono in forma estesa

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 

Il è una grande quantità di controllo fine si hanno a disposizione i risultati. Questi sono descritti nello vignette.

Nell'esempio sopra riportato è possibile vedere che Heading() eliminerà (o modificherà) le intestazioni di una colonna mentre identity è la funzione utilizzata per riepilogare ciascuna combinazione.

e mostrare che creerà l'oggetto tabulare lattice appropriato (con 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} 

Come notato sopra è possibile rimuovere qualsiasi intestazione colonna utilizzando Heading()* colonna in questione

es rimuovere " stazione" dalla prima fila (come intestazione per tutte le colonne)

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

Grazie mille per aver indicato il pacchetto di tabelle. Il tuo approccio fa quello che sto cercando. –

+0

È possibile sbarazzarsi di 'station' nella riga superiore? Il riposo è perfetto. Invece di due righe 'station' e quindi' T1' e 'T2', voglio solo' T1' e 'T2'. Potrei cancellare manualmente la linea in codice latex, ma sto usando knitr e sarebbe utile se potessi cancellare con il codice. –

+0

@Jdbaba - usando 'Heading() * station' - vedi la risposta modificata. – mnel