如何在 R 的 tableGrob 输出表中合并垂直单元格?
How to merge vertical cells in tableGrob output tables in R?
我有一个类似于此处的问题,其中 OP 旨在合并 table 中存在的列的 headers。在这里,我希望合并垂直排列的单元格组。以下是我在 Microsoft Excel 软件中制作的目标 table 设计:-
我尝试使用针对
问题规定的方法来制作目标 table
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)
这将给我以下输出:-
我现在有临时解决办法。但如果我合并偶数个单元格,它将失败。
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)
这个输出是:-
我的问题是如何合并两个 table grob objects 并保留最大 table 的长度作为最终输出。
感谢您的努力,您的回答对我分析结果的呈现有很大的帮助。
干杯
Lune3141
为什么不先设置位置,然后将其发送到 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)
生成上面的 table,但它需要您手动设置所需的位置。
更大的问题可能是您在这里试图完成什么,以及为什么您不想重复 sounds
列。根据您的输出目标,您可能想看看 LaTeX 中的书签之类的东西。
很抱歉造成混淆——我一直在寻找一种更可靠的方法来生成您在问题末尾的 table。这似乎是生成 "merged" 单元格外观所需要做的事情:
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 != 1
和 b != 1
)的所有内容,并将顶部和底部设置到新位置。您将需要手动调整位置或以编程方式为您的实际数据进行调整(例如,它应该匹配多少行,并对其进行算术运算)。
另外,为了使合并的行更加突出,您可能需要考虑在生成 tab2
grob 时设置不同的背景颜色。例如:
tab2 <- tableGrob(df2
, theme = ttheme_default(core=list(bg_params = list(fill = c("white","darkgrey"), col=NA)) )
, rows = NULL)
偶数行示例:
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)
我有一个类似于此处的问题,其中 OP 旨在合并 table
我尝试使用针对
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)
这将给我以下输出:-
我现在有临时解决办法。但如果我合并偶数个单元格,它将失败。
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)
这个输出是:-
我的问题是如何合并两个 table grob objects 并保留最大 table 的长度作为最终输出。
感谢您的努力,您的回答对我分析结果的呈现有很大的帮助。
干杯
Lune3141
为什么不先设置位置,然后将其发送到 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)
生成上面的 table,但它需要您手动设置所需的位置。
更大的问题可能是您在这里试图完成什么,以及为什么您不想重复 sounds
列。根据您的输出目标,您可能想看看 LaTeX 中的书签之类的东西。
很抱歉造成混淆——我一直在寻找一种更可靠的方法来生成您在问题末尾的 table。这似乎是生成 "merged" 单元格外观所需要做的事情:
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 != 1
和 b != 1
)的所有内容,并将顶部和底部设置到新位置。您将需要手动调整位置或以编程方式为您的实际数据进行调整(例如,它应该匹配多少行,并对其进行算术运算)。
另外,为了使合并的行更加突出,您可能需要考虑在生成 tab2
grob 时设置不同的背景颜色。例如:
tab2 <- tableGrob(df2
, theme = ttheme_default(core=list(bg_params = list(fill = c("white","darkgrey"), col=NA)) )
, rows = NULL)
偶数行示例:
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)