如何在R中的tableGrob输出表中合并垂直单元格?

Lun*_*414 5 r ggplot2 gridextra r-grid

我有一个类似于这里的问题,其中OP旨在合并表格水平合并中列的标题.在这里,我希望合并垂直排列的单元组.以下是我在Microsoft Excel软件中设计的目标表: -

在此输入图像描述

我尝试使用水平合并的问题规定的方法制作目标表

library(gridExtra)
library(grid)
library(ggplot2)

alphabets <- c(rep("A", 3), rep("B", 3), rep("C",3))
numbers <- c(rep(c(1,2,3), 3))
sounds <- c('Ayes','Bees','Cees')

df1 <- data.frame(alphabets = alphabets,numbers=numbers)
df2 <- data.frame(sounds = sounds)

tab1 <- tableGrob(df1,theme = ttheme_default(),row=NULL)
tab2 <- tableGrob(df2,theme = ttheme_default(),row=NULL)

halign <- combine(tab2,tab1, along =1)

grid.draw(halign)
Run Code Online (Sandbox Code Playgroud)

这将给我以下输出: -

在此输入图像描述

我现在有一个临时的工作.但如果我合并多个单元格,它将会失败.

sounds <- c('','Ayes','','','Bees','','','Cees','')
df2 <- data.frame(sounds = sounds)
tab2 <- tableGrob(df2,theme = ttheme_default(),row=NULL)
halign <- combine(tab2,tab1, along =1)
grid.draw(halign)
Run Code Online (Sandbox Code Playgroud)

输出结果如下: -

在此输入图像描述

我的问题是如何合并两个表格grob对象并保留最大输出的最大表格的长度.

感谢您的努力,答案将极大地有助于我的分析结果的呈现.

干杯

Lune3141

Mar*_*son 2

为什么不先设置位置,然后将其发送到tableGrob

# Set locations you want to put sounds at
df2$toBind <- c(2, 5, 8)

# Set locations to allow merge
df1$toBind <- 1:nrow(df1)

# Merge them together
toPrint <-
  right_join(df2, df1) %>%
  mutate(sounds = ifelse(is.na(sounds)
                         , ""
                         , as.character(sounds))) %>%
  select(-toBind)

grid.table(toPrint, row = NULL)
Run Code Online (Sandbox Code Playgroud)

生成上面的表格,尽管它需要您手动设置所需的位置。

更大的问题可能是您在这里想要完成什么,以及为什么您不想重复该sounds专栏。根据您的输出目标,您可能需要查看 LaTeX 中的书籍标签之类的内容。

抱歉造成混乱 - 我正在寻找一种更可靠的方法来生成您在问题末尾的表格。这似乎是您需要执行的操作来生成“合并”单元格外观:

halign$layout[halign$layout$t != 1 &
                halign$layout$l == 1, c("t")] <-
  c(2,5,8,2,5,8)

halign$layout[halign$layout$b != 1  &
                halign$layout$l == 1, c("b")] <-
  c(4,7,10,4,7,10)

grid.draw(halign)
Run Code Online (Sandbox Code Playgroud)

这是查找第一列 ( l == 1) 中不是第一行(t != 1b != 1)的所有内容,并将顶部和底部设置到新位置。您需要手动调整位置,或者以编程方式针对实际数据进行调整(例如,它应该匹配多少行,并对其进行算术)。

在此输入图像描述

另外,为了使合并的行更加突出,您可能需要考虑在生成 grob 时设置不同的背景颜色tab2。例如,:

tab2 <- tableGrob(df2
                  , theme = ttheme_default(core=list(bg_params = list(fill = c("white","darkgrey"), col=NA)) )
                  , rows = NULL)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

偶数行的示例:

halign_alt <- combine(tab2,tab3, along =1)

halign_alt$layout[halign_alt$layout$t != 1 &
                    halign_alt$layout$l == 1, c("t")] <-
  c(2,5,7,2,5,7)

halign_alt$layout[halign_alt$layout$b != 1  &
                    halign_alt$layout$l == 1, c("b")] <-
  c(4,6,9,4,6,9)

grid.draw(halign_alt)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述