2016-09-27 66 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