Может ли tbl_summary отображать как уровни, так и подуровни переменной (т. Е. для столбца сводной статистики)?

#r #gtsummary

Вопрос:

Я составляю таблицу с помощью tbl_summary, и мне интересно, можно ли разделить метки diamond_cat по уровням четкости, сохранив при этом сводную статистику для обоих? Я также приложу изображение таблицы, которую я себе представляю:

 library(gtsummary)
library(forcats)
data(diamonds)
table(diamonds$clarity)
# I1   SI2   SI1   VS2   VS1  VVS2 
# 741  9194 13065 12258  8171  5066 
# VVS1    IF 
# 3655  1790 

diamond_cat <- fct_collapse(diamonds$clarity,
                            "Internally flawless" = "IF",
                            "Very very slightly included" = c("VVS1", "VVS2"),
                            "Very slightly included" = c("VS1", "VS2"),
                            "Slightly included" = c("SI1", "SI2"),
                            "Included" = "I1")
# add new variable to data set
diamonds$diamond_cat <- diamond_cat

diamonds %>% select(diamond_cat) %>% tbl_summary()
#diamonds %>% select(clarity) %>% tbl_summary()
    
 

введите описание изображения здесь

Я довольно новичок в Р. Заранее благодарю вас за вашу помощь.

Ответ №1:

Да, это возможно. НО, tbl_summary() он не был написан с учетом этой функциональности, поэтому код для его работы является сложным. Пример ниже!

 library(gtsummary)

# save recodes because they will be used more than once
clarity_recodes <-
  list(
    "Internally flawless" = "IF",
    "Very very slightly included" = c("VVS1", "VVS2"),
    "Very slightly included" = c("VS1", "VS2"),
    "Slightly included" = c("SI1", "SI2"),
    "Included" = "I1"
  )

# build typical tbl_summary with the recoded clarity data
tbl1 <-
  ggplot2::diamonds %>%
  mutate(
    clarity_cat = forcats::fct_collapse(clarity, !!!clarity_recodes)
  ) %>%
  select(clarity_cat) %>%
  tbl_summary(label = clarity_cat ~ "Diamond Clarity")

# create a tibble of recoded summary stats
tbl2 <-
  ggplot2::diamonds %>%
  select(clarity) %>%
  tbl_summary() %>%
  modify_column_unhide(c(row_type)) %>%
  as_tibble(col_labels = FALSE) %>%
  dplyr::left_join(
    clarity_recodes %>% 
      tibble::enframe("label2", "label") %>% 
      tidyr::unnest(cols = c(label)),
    by = "label"
  ) %>%
  dplyr::with_groups(label2, ~dplyr::filter(.x, row_type == "level", dplyr::n() > 1)) %>%
  mutate(row_type = "double_indent") %>%
  tidyr::nest(data = -c(label2)) %>%
  dplyr::rename(label = label2)

# merge in the tibble with clarity details into the larger summary table
tbl_final <-
  tbl1 %>%
  modify_table_body(
    ~.x %>%
      dplyr::left_join(tbl2, by = c("label")) %>%
      dplyr::mutate(
        data =
          purrr::pmap(
            list(data, row_type, label, stat_0), 
            function(data, row_type, label, stat_0) {
              df <- tibble::tibble(
                row_type = row_type, 
                label = label,
                stat_0 = stat_0
              )
              if (!is.null(data)) return(dplyr::bind_rows(df, data))
              else return(df)
            }
          )
      ) %>%
      select(-row_type, -label, -stat_0) %>%
      tidyr::unnest(data)
  ) %>%
  modify_table_styling(
    columns = c(label, stat_0),
    rows = row_type == "double_indent",
    text_format = "indent2"
  ) %>%
  modify_table_styling(
    columns = stat_0,
    align  = "left"
  )
 

введите описание изображения здесь
Создано 2021-08-21 пакетом reprex (v2.0.1)

Комментарии:

1. Вау, это именно то, чего я хотел; большое вам спасибо за ваш быстрый и полезный ответ!