2024-11-08 15:13:33 +01:00
|
|
|
#' Print a flexible baseline characteristics table
|
|
|
|
|
#'
|
|
|
|
|
#' @param data data set
|
|
|
|
|
#' @param fun.args list of arguments passed to
|
|
|
|
|
#' @param fun function to
|
|
|
|
|
#' @param vars character vector of variables to include
|
|
|
|
|
#'
|
|
|
|
|
#' @return object of standard class for fun
|
|
|
|
|
#' @export
|
|
|
|
|
#'
|
|
|
|
|
#' @examples
|
|
|
|
|
#' mtcars |> baseline_table()
|
|
|
|
|
#' mtcars |> baseline_table(fun.args = list(by = "gear"))
|
2026-03-30 20:18:10 +02:00
|
|
|
baseline_table <- function(data,
|
|
|
|
|
fun.args = NULL,
|
|
|
|
|
fun = gtsummary::tbl_summary,
|
|
|
|
|
vars = NULL) {
|
2024-11-08 15:13:33 +01:00
|
|
|
out <- do.call(fun, c(list(data = data), fun.args))
|
|
|
|
|
return(out)
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-24 14:40:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#' Create a baseline table
|
|
|
|
|
#'
|
|
|
|
|
#' @param data data
|
|
|
|
|
#' @param ... passed as fun.arg to baseline_table()
|
|
|
|
|
#' @param add.p add comparison/p-value
|
|
|
|
|
#' @param add.overall add overall column
|
2025-11-09 12:04:29 +01:00
|
|
|
#' @param by.var specify stratification variable
|
|
|
|
|
#' @param theme set table theme
|
|
|
|
|
#' @param detail_level specify detail level. Either "minimal" or "extended".
|
2025-03-24 14:40:30 +01:00
|
|
|
#'
|
|
|
|
|
#' @returns gtsummary table list object
|
|
|
|
|
#' @export
|
|
|
|
|
#'
|
|
|
|
|
#' @examples
|
2025-04-02 11:31:04 +02:00
|
|
|
#' mtcars |> create_baseline(by.var = "gear", add.p = "yes" == "yes")
|
2025-11-09 12:04:29 +01:00
|
|
|
#' mtcars |> create_baseline(by.var = "gear", detail_level = "extended")
|
|
|
|
|
#' mtcars |> create_baseline(by.var = "gear", detail_level = "extended",type = list(gtsummary::all_dichotomous() ~ "categorical"),theme="nejm")
|
|
|
|
|
#'
|
2025-04-15 08:55:35 +02:00
|
|
|
#' create_baseline(default_parsing(mtcars), by.var = "am", add.p = FALSE, add.overall = FALSE, theme = "lancet")
|
2026-03-30 20:18:10 +02:00
|
|
|
create_baseline <- function(data,
|
|
|
|
|
...,
|
|
|
|
|
by.var,
|
|
|
|
|
add.p = FALSE,
|
|
|
|
|
add.diff = FALSE,
|
|
|
|
|
add.overall = FALSE,
|
|
|
|
|
theme = c("jama", "lancet", "nejm", "qjecon"),
|
|
|
|
|
detail_level = c("minimal", "extended"),
|
|
|
|
|
drop_empty = FALSE) {
|
2025-04-02 11:31:04 +02:00
|
|
|
theme <- match.arg(theme)
|
|
|
|
|
|
2025-11-09 12:04:29 +01:00
|
|
|
detail_level <- match.arg(detail_level)
|
|
|
|
|
|
2025-03-24 14:40:30 +01:00
|
|
|
if (by.var == "none" | !by.var %in% names(data)) {
|
|
|
|
|
by.var <- NULL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
## These steps are to handle logicals/booleans, that messes up the order of columns
|
2025-04-02 11:31:04 +02:00
|
|
|
## Has been reported and should be fixed soon (02042025)
|
2025-03-24 14:40:30 +01:00
|
|
|
|
|
|
|
|
if (!is.null(by.var)) {
|
2025-04-02 11:31:04 +02:00
|
|
|
if (identical("logical", class(data[[by.var]]))) {
|
2025-03-24 14:40:30 +01:00
|
|
|
data[by.var] <- as.character(data[[by.var]])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-15 16:14:03 +02:00
|
|
|
suppressMessages(gtsummary::theme_gtsummary_journal(journal = theme))
|
2025-04-02 11:31:04 +02:00
|
|
|
|
2025-04-15 08:55:35 +02:00
|
|
|
args <- list(...)
|
|
|
|
|
|
2025-11-09 12:04:29 +01:00
|
|
|
# browser()
|
|
|
|
|
|
|
|
|
|
if (!any(hasName(args, c("type", "statistic")))) {
|
|
|
|
|
if (detail_level == "extended") {
|
|
|
|
|
args <-
|
2026-03-30 20:18:10 +02:00
|
|
|
modifyList(args, list(
|
|
|
|
|
type = list(
|
|
|
|
|
gtsummary::all_continuous() ~ "continuous2",
|
|
|
|
|
gtsummary::all_dichotomous() ~ "categorical"
|
|
|
|
|
),
|
|
|
|
|
statistic = list(
|
|
|
|
|
gtsummary::all_continuous() ~ c("{median} ({p25}, {p75})", "{mean} ({sd})", "{min}, {max}")
|
2025-11-09 12:04:29 +01:00
|
|
|
)
|
2026-03-30 20:18:10 +02:00
|
|
|
))
|
2025-11-09 12:04:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-30 20:18:10 +02:00
|
|
|
if (isTRUE(drop_empty)) {
|
|
|
|
|
## Drops empty levels if minimal
|
|
|
|
|
data <- data |> REDCapCAST::fct_drop()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
parameters <- list(data = data, fun.args = purrr::list_flatten(list(by = by.var, args)))
|
2025-04-15 08:55:35 +02:00
|
|
|
|
2025-11-09 12:04:29 +01:00
|
|
|
|
|
|
|
|
# browser()
|
2026-03-30 20:18:10 +02:00
|
|
|
out <- do.call(baseline_table, parameters)
|
2025-04-15 08:55:35 +02:00
|
|
|
|
2025-03-24 14:40:30 +01:00
|
|
|
|
|
|
|
|
if (!is.null(by.var)) {
|
2025-04-02 11:31:04 +02:00
|
|
|
if (isTRUE(add.overall)) {
|
|
|
|
|
out <- out |> gtsummary::add_overall()
|
2025-03-24 14:40:30 +01:00
|
|
|
}
|
|
|
|
|
if (isTRUE(add.p)) {
|
|
|
|
|
out <- out |>
|
|
|
|
|
gtsummary::add_p() |>
|
|
|
|
|
gtsummary::bold_p()
|
|
|
|
|
}
|
2025-12-11 22:48:30 +01:00
|
|
|
if (isTRUE(add.diff)) {
|
|
|
|
|
out <- out |>
|
|
|
|
|
gtsummary::add_difference()
|
|
|
|
|
}
|
2025-04-02 11:31:04 +02:00
|
|
|
}
|
2025-03-24 14:40:30 +01:00
|
|
|
|
|
|
|
|
out
|
|
|
|
|
}
|