1

这次有一个特殊要求,因为知道如何获得我想要的表输出,但想知道 expss 是否存在不那么冗长的解决方案。首先,这个主题可以被认为是这个讨论的扩展 -->带有 expss 包的复杂表,并且也与另一个有关 -->如何在 expss 表中显示仅选择子组 + 整个数据框的结果?

我的表结构如下:首先显示总数据框行的结果,然后按子组拆分。截至今天,以下是我的处理方式(以infert数据集为例):

1) 表格模板

### Banner set up
my_banner = infert %>%
  tab_cols(total())
my_custom_table = . %>%  
  tab_significance_options(sig_level=0.2, keep="none", sig_labels=NULL, subtable_marks="greater", mode="append") %>%
  tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>% 
  tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
  # Parity x Education
  tab_cols(education) %>%
  tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>% 
  tab_last_add_sig_labels() %>%
  tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
  tab_last_add_sig_labels() %>%
  tab_last_sig_cpct(label="T.1", compare_type="subtable")

2) 创建 3 个不同的表(总计 1 个,每个子组 1 个),合并为一个:

tab1 <- my_banner %>%
  tab_cells(parity) %>%
  my_custom_table() %>%
  tab_pivot(stat_position="inside_columns")
tab2 <- infert %>%
  apply_labels(education="education (CASE 0)") %>%
  tab_cells(parity) %>%
  tab_cols(total(label = "CASE 0")) %>%
  tab_subgroup(case==0) %>%
  my_custom_table() %>%
  tab_pivot(stat_position="inside_columns")
tab3 <- infert %>%
  apply_labels(education="education (CASE 1)") %>%
  tab_cells(parity) %>%
  tab_cols(total(label = "CASE 1")) %>%
  tab_subgroup(case==1) %>%
  my_custom_table() %>%
  tab_pivot(stat_position="inside_columns")

final_tab <- tab1 %merge% tab2 %merge% tab3

所有这段代码仅适用于 1 个表,您了解我的担心。有什么好的实践技巧可以避免这个冗长(但有效)的序列吗?我的第一个猜测是:

my_banner %>%
  tab_cells(parity) %>%
  my_custom_table() %>%
  tab_subgroup(case==0) %>%
  my_custom_table() %>%
  tab_subgroup(case==1) %>%
  my_custom_table() %>%
  tab_pivot(stat_position="inside_columns")

计算了一个表,但输出远不及目标,可能有一个修复,但我不知道在哪里寻找。任何帮助将不胜感激,谢谢!(注意:如果一个简单的解决方案涉及摆脱#TOTAL 列,我也可以)

4

1 回答 1

2

关键思想是%nest%tab_cols代替中使用tab_subgroup

library(expss)
data(infert)
my_banner = infert %>%
    apply_labels(
        education = "education",
        case = c(
            "CASE 0" = 0,
            "CASE 1" = 1
        )
    ) %>% 
    tab_cols(total(), education, case %nest% list(total(label = ""), education))

my_custom_table = . %>%  
    tab_significance_options(sig_level=0.2, keep="none", sig_labels=NULL, subtable_marks="greater", mode="append") %>%
    tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>% 
    tab_last_add_sig_labels() %>%
    tab_stat_cpct(label="%Col.",
                  total_row_position="above", 
                  total_statistic=c("u_cases", "u_cpct"), 
                  total_label=c("TO_DELETE_TOTAL", "TOTAL")) %>%
    tab_last_add_sig_labels() %>%
    tab_last_sig_cpct(label="T.1", compare_type="subtable") %>% 
    tab_pivot(stat_position="inside_columns") %>% 
    # drop auxilary rows and columns
    where(!grepl("TO_DELETE", row_labels)) %>% 
    except(fixed("Total|T.1"), fixed("CASE 0|T.1"), fixed("CASE 1|T.1"))

my_banner %>% 
    tab_cells(parity) %>% 
    my_custom_table()
于 2020-04-12T20:52:22.370 回答