Search code examples
gtsummary

tbl_summary ( gtsummary) transpose with p-values


I was wondering if there is a way to compose such a table :

library(gtsummary)
data(trial)

add_p_ex1 <-
  trial[c("marker",  "trt")] %>%
  tbl_summary(by = trt) %>%
  add_p()


add_p_ex2 <-
  trial[c("marker",  "death")] %>%
  tbl_summary(by = death) %>%
  add_p()


as1=add_p_ex1$table_body
as2=add_p_ex2$table_body
write.csv(rbind(as1, as2), file='temp1.csv')

With an output that is transposed version of as1 and as2 like this : Ideally for K - continuous variable ( eg marker 1 , marker 2, ... maker k) and a P number of categorical variables.

       Marker Level (ng/mL) Pvalue
trt 

drug A  0.84 (0.24, 1.57)   0.084746992242773
drug B  0.52 (0.19, 1.20)   

Death   

0     0.73 (0.23, 1.33)    0.605276987642371
1     0.57 (0.20, 1.45) 

Solution

  • It's possible to get your table like this, and I've provided a code example below. I am not sure if it's the easiest way to get what you're looking for, however.

    library(gtsummary)
    library(tidyverse)
    
    # function to transpose a tbl_summary table
    gtsummary_transpose <- function(data, con_var, cat_var) {
      tbl <- data[c(con_var,  cat_var)] %>%
        tbl_summary(by = cat_var, missing = "no") %>%
        add_p() %>%
        modify_header(stat_by = "{level}", 
                      p.value = "p.value",
                      label = "label") %>%
        as_tibble() %>%
        select(-label) %>%
        pivot_longer(cols = -p.value) %>%
        select(name, value, p.value) 
      
      # add a header row
      bind_rows(
        tibble(name = attr(data[[cat_var]], "label") %||% cat_var),
        tbl
      ) %>%
        fill(p.value, .direction = "up") %>%
        mutate(p.value = ifelse(row_number() == 1, p.value, NA))
    }
    
    gtsummary_transpose(trial, "marker", "trt")
    
    # transose multiple tables, and stack them 
    tibble(variable = c("trt", "grade")) %>%
      mutate(
        tbl = map(variable, ~gtsummary_transpose(trial, "marker", .x))
      ) %>%
      unnest(cols = tbl) %>%
      gt::gt() %>%
      gt::cols_hide(vars(variable)) %>%
      gt::cols_label(name = "Characteristic", value = "Marker Level", p.value = "p-value") %>%
      gt::fmt_missing(columns = everything(), missing_text = "")
    

    enter image description here