Добавить и сложить подгруппы в одну таблицу Expss - PullRequest
1 голос
/ 11 апреля 2020

На этот раз особый запрос, поскольку я знаю, как добраться до нужной мне таблицы, но хотел бы знать, существует ли менее многословное решение с expss. Во-первых, эту топи c можно считать продолжением этого обсуждения -> Сложные таблицы с пакетом 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, мне тоже хорошо)

1 Ответ

1 голос
/ 12 апреля 2020

Основная идея заключается в использовании %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()
...