2017-04-14 78 views
1

我擁有包含多個人口因素的數據。將多個彙總表與子標題結合使用

我想創建這樣的出版質量的彙總表:

     N 
Sex 
     M    150 
     F    150 
Marital Status 
     Single  100 
     Married  100 
     Divorced  100 
Age 
     <25   75 
     25-34   75 
     35-44   75 
     >= 45   75 

我可以很容易地產生這樣每個人一塊,就像這樣:

require(dplyr) 

dd <- data.frame(barcode = c("16929", "64605", "03086", "29356", "23871"), 
    sex = factor(c("M", "F", "M", "F", "M")), 
    marital = factor(c("Married", "Single", "Single", "Single", "Divorced")), 
    age_group = factor(c("<25", "25-34", "35-44", "45-54", ">= 55"))) 

require(dplyr) 

age_groups <- dd %>% group_by(age_group) %>% count() 
sex <- dd %>% group_by(sex) %>% count() 
marital <- dd %>% group_by(marital) %>% count() 

,我能創造個人使用幾種解決方案中的任何一種來爲他們中的每個解決方案表,如kablepander

require(knitr) 
kable(age_groups) 
kable(sex) 
kable(marital) 

但我不能找到一種方法,他們爲每個類別副標題組合成一個單一的表的部分。單獨的表格有不同的列寬,並用手對齊它們並插入插入的子標題行(在未加工的LaTeX中?)似乎是一個不好的解決方案。

這是一個非常常見的報告格式 - 許多期刊文章的標準表1 - 我想找到一個通用的解決方案來創建它。

+0

我通常的解決辦法是把這些值與行和列名安裝一個矩陣就是我想要在表格和NA值我想要的空間。然後,我使用相同名稱的包中的'xtable'構造一個Latex表。有關於如何讓它跨越多行的SO帖子,但它可以是一個棘手的工作。 – lmo

回答

2
library(expss) 
library(knitr) 
dd = data.frame(barcode = c("16929", "64605", "03086", "29356", "23871"), 
       sex = factor(c("M", "F", "M", "F", "M")), 
       marital = factor(c("Married", "Single", "Single", "Single", "Divorced")), 
       age_group = factor(c("<25", "25-34", "35-44", "45-54", ">= 55"), 
            levels = c("<25", "25-34", "35-44", "45-54", ">= 55"))) 


dd %>% tab_cells("Sex" = sex, "Marital status" = marital, "Age" = age_group) %>% 
    tab_cols(total(label = "N")) %>% 
    tab_stat_cases(total_row_position = "none") %>% 
    tab_pivot() 

以上代碼生成的輸出如在你的榜樣,但僅適用於HTML輸出工作。 第二個代碼片段適用於所有knitr格式,但輸出與您的示例略有不同。

dd %>% tab_cells("Sex" = sex, "Marital status" = marital, "Age" = age_group) %>% 
    tab_cols(total(label = "N")) %>% 
    tab_stat_cases(total_row_position = "none") %>% 
    tab_pivot() %>% 
    split_columns() %>% 
    kable() 

首頁輸出:

第二輸出:

0

這不是一個完整的解決方案,但一個好的開始可能是pander包。

library(pander) 
pander(list(`Age groups` = age_groups, `Sex` = sex, `Marital` = marital)) 
# 
# 
# * **Age groups**: 
# 
#  --------------- 
#  age_group n 
#  ----------- --- 
#   <25  1 
# 
#  >= 55  1 
# 
#  25-34  1 
# 
#  35-44  1 
# 
#  45-54  1 
#  --------------- 
# 
# * **Sex**: 
# 
#  --------- 
#  sex n 
#  ----- --- 
#  F 2 
# 
#  M 3 
#  --------- 
# 
# * **Marital**: 
# 
#  -------------- 
#  marital n 
#  ---------- --- 
#  Divorced 1 
# 
#  Married 1 
# 
#  Single 3 
#  -------------- 
# 
# 
# <!-- end of list --> 
# 
#