Scott Horvath Scott Horvath - 2 months ago 34
R Question

Merging Table Header Cells Using tableGrob

I am currently creating a table image using:

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)


With output:
enter image description here

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


However, I would like to merge the top headers to achieve this output (as png or pdf):

enter image description here

This table was created in Excel. X, Y and Z are within merged cells.

Is anyone able to assist with methods on merging cells?

Answer

One way would be to use join (described here), to add an additional header row to your table.

Using an idea from here you can create a tableGrob for the additional header row.

You can then alter the l, and r of the gtable to correct the positioning.

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

Comments