2016-09-27 63 views
4

我有一个类似于这里的问题,其中OP旨在合并表horizontal merging表中列的标题。这里我想合并垂直排列的单元组。以下是我在微软的Excel软件制作目标表的设计: -如何合并R中tableGrob输出表中的垂直单元格?

enter image description here

我在制作使用规定的问题,该方法的目标表horizontal merging

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) 

尝试这会给我以下的输出: -

enter image description here

我有一个TEM现在开始进行临时工。但是如果我合并偶数个单元格,它将会失败。

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) 

的输出是这样的: -

enter image description here

我的问题是你怎么能合并两个表格罗对象,并保持最大的表的长度为最终输出。

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

干杯

Lune3141

+0

不完全是你问的是什么,但一个快速和简单的解决办法是有该块的顶部行中的“合并”单元的名称,而不是其中的块的中间行。 复杂,但更准确的答案将更多地利用arrange.grid()函数,对https://cran.r-project.org/web/packages/gridExtra/vignettes/arrangeGrob如图所示。 html。 – Xizam

+0

@Xizam这仍然是一个解决不能合并垂直单元格的真正问题的工作(就像我们可以在Excel软件中那样)。我考虑过使用顶行标记块的想法。当块大小稍长时,它在美学上效果不好。 – Lune3414

回答

1

为什么不先设置的位置,然后将其发送到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) 

可生产你有上面的表格,但它需要你手动设置你希望他们的位置。

更大的问题可能是您在此尝试完成的任务,以及为什么您不想重复sounds列。根据您的输出目标,您可能需要在LaTeX中查看类似booktabs的内容。

对不起,我一直在寻找一种更可靠的方法来生成问题结束时的表格。这似乎是你需要做的,产生了“合并”电池是什么:

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) 

这是发现在第一列的一切(l == 1)不是第一行(t != 1b != 1分别),并设置顶部和底部到新的位置。您将需要手动调整位置,或者根据实际数据以编程方式进行调整(例如,应该匹配多少行,并对其进行算术运算)。

enter image description here

作为一个额外的一边,使合并后的行更加突出,你可能要考虑产生tab2 GROB时设置不同的背景颜色。例如,:

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

enter image description here

例与偶数行:

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) 

enter image description here

+0

谢谢@Mark Peterson。您的解决方案是对我的解决方案的改进。不幸的是,它没有实现合并水平列的[this](http://stackoverflow.com/questions/33214671/merging-table-header-cells-using-tablegrob/33218463#33218463)解决方案。 – Lune3414

+0

我误解了,并试图匹配您发布的内容,而不是像我现在理解的那样合并。请参阅编辑以了解适用的版本。 –

+0

这是获取表格的非常酷的方式。对不起,我对$布局有点新了。一个问题。因此,通过更改halign $ layout $ t,您可以将不在目标颜色的顶部和底部单元移动到新的位置。那是对的吗。当我们必须合并偶数个单元格(比如2个单元格)时,我们仍然会遇到问题。现在我会接受你的答案,因为它确实让我几乎在那里。欢呼声 – Lune3414