Comparing Against Baselines or Control

knitr::opts_chunk$set(comment = "#")

```{css, echo=FALSE}

.sourcecode { background-color:lightblue; } .reveal .r code { white-space: pre; }

## Introduction


Often the data from one column is considered the
reference/baseline/comparison group and is compared to the data from
the other columns.

For example, lets calculate the average age:


```r
library(rtables)

lyt <- basic_table() %>%
  split_cols_by("ARM") %>%
  analyze("AGE")

tbl <- build_table(lyt, DM)
tbl

and then the difference of the average AGE between the placebo arm and the other arms:

lyt2 <- basic_table() %>%
  split_cols_by("ARM", ref_group = "B: Placebo") %>%
  analyze("AGE", afun = function(x, .ref_group) {
    in_rows(
      "Difference of Averages" = rcell(mean(x) - mean(.ref_group), format = "xx.xx")
    )
  })

tbl2 <- build_table(lyt2, DM)
tbl2

Note that the column order has changed and the reference group is displayed in the first column.

In cases where we want cells to be blank in the reference column, (e.g., "B: Placebo") we use non_ref_rcell() instead of rcell(), and pass .in_ref_col as the second argument:

lyt3 <- basic_table() %>%
  split_cols_by("ARM", ref_group = "B: Placebo") %>%
  analyze(
    "AGE",
    afun = function(x, .ref_group, .in_ref_col) {
      in_rows(
        "Difference of Averages" = non_ref_rcell(mean(x) - mean(.ref_group), is_ref = .in_ref_col, format = "xx.xx")
      )
    }
  )

tbl3 <- build_table(lyt3, DM)
tbl3

lyt4 <- basic_table() %>%
  split_cols_by("ARM", ref_group = "B: Placebo") %>%
  analyze(
    "AGE",
    afun = function(x, .ref_group, .in_ref_col) {
      in_rows(
        "Difference of Averages" = non_ref_rcell(mean(x) - mean(.ref_group), is_ref = .in_ref_col, format = "xx.xx"),
        "another row" = non_ref_rcell("aaa", .in_ref_col)
      )
    }
  )

tbl4 <- build_table(lyt4, DM)
tbl4

You can see which arguments are available for afun in the manual for analyze().

Row Splitting

When adding row-splitting the reference data may be represented by the column with or without row splitting. For example:

lyt5 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ARM", ref_group = "B: Placebo") %>%
  split_rows_by("SEX", split_fun = drop_split_levels) %>%
  analyze("AGE", afun = function(x, .ref_group, .ref_full, .in_ref_col) {
    in_rows(
      "is reference (.in_ref_col)" = rcell(.in_ref_col),
      "ref cell N (.ref_group)" = rcell(length(.ref_group)),
      "ref column N (.ref_full)" = rcell(length(.ref_full))
    )
  })

tbl5 <- build_table(lyt5, subset(DM, SEX %in% c("M", "F")))
tbl5

The data assigned to .ref_full is the full data of the reference column whereas the data assigned to .ref_group respects the subsetting defined by row-splitting and hence is from the same subset as the argument x or df to afun.



Try the rtables package in your browser

Any scripts or data that you put into this service are public.

rtables documentation built on Sept. 30, 2024, 9:32 a.m.