Cell merge by column in kableExtra

Hi folks,

kableExtra::collapse_rows provides a nice way to create tables with collapsed (or merged) cells by row. I was wondering if kableExtra also provides a method to collapse cells by column. For instance, in the example below, I would like to merge the b's in the 2nd row of my table.

If this functionality is not available in kableExtra, are you aware of a package that provides the ability to:

  • collapse cells by column and/or row, and
  • add column headers on grouped columns

Thanks in adance


dt <- data.frame(
  var1 = c(1, 2, 3, 3, 4),
  var2 = c('a', 'b', 'c', 'c', 'e'),
  var3 = c('f', 'b', 'g', 'h', 'i')

kable(dt, align = "c") %>%
  kable_styling(full_width = FALSE) %>%
  collapse_rows(columns = 1:3, valign = "middle")
1 Like

Just wanna chime in and say that I am also looking for the possibility to merge rows in kable tables. I tried looking at the code for the collapse_rows function to try and adapt it to columns. I suspect that there should be a way of inserting the colspan HTML argument instead of rowspan, which the collapse_row function uses. However, I am not proficient enough in HTML nor in the nitty gritty details of function creation in R to actually modify the original function to suit my needs.

Hi @mafw

I found that the flextable package provides functionality to merge cells by row and/ column. However, it seems to lack latex reporting functionality, which I need. Anyways, depending on your requirements, flextable might be an option for you.

1 Like

Thanks for the advice! I'll look into the flextable package. Maybe I can try and adapt the row merge function from that package to my kableextra workflow...


The more I look into the capabilities of the huxtable package, the more I like it. You may want to have a look.


Thanks for the advice again @pomchip! I've considered huxtable before but I have a problem finding that one R package that can do all the things I need to make nice formatted tables. I'm testing a bunch packages of packages to find the right one. I haven't gotten to huxtable yet but I'll be sure to give it a try!

You might want to check out gt. It's good at grouped headers, I believe. Meanwhile, here's a huxtable example:

as_hux(head(mtcars)) %>% 
    insert_row("MPG-DISP", "", "", "HP-WT", fill = "") %>% 
    merge_cells(1, 1:3) %>% 
    merge_cells(1, 4:6) %>%  
    set_header_rows(1, TRUE) %>% 
   style_headers(bold = TRUE)

which produces:

  MPG-DISP            HP-WT                           
   mpg   cyl   disp    hp   drat     wt   qsec    vs  
  21       6    160   110   3.9    2.62   16.5     0  
  21       6    160   110   3.9    2.88   17       0  
  22.8     4    108    93   3.85   2.32   18.6     1  
  21.4     6    258   110   3.08   3.21   19.4     1  
  18.7     8    360   175   3.15   3.44   17       0  
  18.1     6    225   105   2.76   3.46   20.2     1  

and which prints nicely to HTML or PDF. You can style further at will.

Thanks @hughjonesd,

I considered using gt, but, IMO, huxtable currently provides more functionality than gt (in particular the range of possible outputs and the merging capabilities within the table itself).