2015-10-19 17 views
7

Ich bin derzeit mit einer Tabelle zu erstellen:Verbinden von Tabellenkopfzellen mit tableGrob

SummaryTable <- data.frame(
    index, 

    xa, 
    xb, 

    ya, 
    yb, 

    za, 
    zb 

) 
names(SummaryTable) <- c("Index", 
         "Main X Sub A", 
         "Main X Sub B", 
         "Main Y Sub A", 
         "Main Y Sub B", 
         "Main Z Sub A", 
         "Main Z Sub B") 

tt <- ttheme_default(colhead=list(fg_params = list(parse=TRUE))) 
tbl <- tableGrob(SummaryTable, rows=NULL, theme=tt) 

grid.arrange(tbl,as.table=TRUE) 

Mit Ausgabe: enter image description here

Mit dput (SummaryTable):

structure(list(Index = 0:8, `Main X Sub A` = c(1, 0.69, 0.61, 
0.56, 0.5, 0.44, 0.4, 0.36, 0.33), `Main X Sub B` = c(0.86, 0.62, 
0.51, 0.42, 0.36, 0.31, 0.27, 0.24, 0.23), `Main Y Sub A` = c(1, 
0.8, 0.74, 0.68, 0.63, 0.56, 0.52, 0.47, 0.43), `Main Y Sub B` = c(0.86, 
0.77, 0.67, 0.59, 0.53, 0.47, 0.43, 0.39, 0.36), `Main Z Sub A` = c(0, 
0.17, 0.23, 0.27, 0.33, 0.37, 0.42, 0.46, 0.49), `Main Z Sub B` = c(0, 
0.24, 0.33, 0.42, 0.48, 0.55, 0.6, 0.64, 0.66)), .Names = c("Index", 
"Main X Sub A", "Main X Sub B", "Main Y Sub A", "Main Y Sub B", 
"Main Z Sub A", "Main Z Sub B"), row.names = c(NA, -9L), class = "data.frame") 

Aber ich möchte die oberen Header zusammenführen, um diese Ausgabe zu erreichen (als PNG oder PDF):

enter image description here

Diese Tabelle wurde in Excel erstellt. X, Y und Z sind innerhalb von verbundenen Zellen.

Kann jemand mit Methoden zum Zusammenführen von Zellen helfen?

+0

Bitte 'dput (SummaryTable)'. PNGs sind nutzlos. – vaettchen

Antwort

6

Eine Möglichkeit wäre combine zu verwenden, anstatt join (described here), eine zusätzliche Kopfzeile zu Ihrer Tabelle hinzuzufügen.

Mit einer Idee von here können Sie eine tableGrob für die zusätzliche Kopfzeile erstellen.

Sie können dann die l und r der gtable ändern, um die Positionierung zu korrigieren.

library(grid) 
library(gridExtra) 

# example data & header row 
tab <- tableGrob(mtcars[1:3, 1:4], rows=NULL) 
header <- tableGrob(mtcars[1, 1:2], rows=NULL, cols=c("head1", "head2")) 

jn <- combine(header[1,], tab, along=2) 
jn$widths <- rep(max(jn$widths), length(jn$widths)) # make column widths equal 
#grid.newpage() 
#grid.draw(jn) # see what it looks like before altering gtable 

# change the relevant rows of gtable 
jn$layout[1:4 , c("l", "r")] <- list(c(1, 3), c(2, 4)) 

grid.newpage() 
grid.draw(jn) 

enter image description here

+0

Thanks @ user20650 ich dies für meine Tabelle bin versucht, diesen Code verwenden: 'Tab <- tableGrob (SummaryTable [1: 9, 2: 7], rows = NULL) Header <- tableGrob (SummaryTable [1, 1: 3], rows = NULL, cols = c ("head1", "head2", "head3")) jn <- join (header [1,], tab, entlang = 2) jn $ width <- rep (max (jn $ Breite), Länge (jn $ Breite)) jn $ Layout [1: 7, c ("l", "r")] <- Liste (c (1, 3), c (2 , 5), c (4, 7)) ' Hier ist mein Ergebnis, mit den Headern nicht zusammengeführt. http://i.imgur.com/89UNHt2.png –

+1

Fast dort ... versuche 'jn $ layout [1: 6, c (" l "," r ")] <- list (c (1, 3, 5), c (2, 4, 6)). Es lohnt sich, 'jn $ layout [1: 6,]' vor und nach den Änderungen zu betrachten, um zu sehen, dass sie sinnvoll sind. Dies verwendet Vektorrecycling, so dass die Spalte 'l'eft' 1,3,5,1 ist. 3,5' und 'r'ight' 2,4,6,2,4,6' – user20650

+0

@ScottHorvath, Sie sollten diese Antwort akzeptieren –