tests/testthat/test-coalesce-behavior.R

#
# Unit test for testing coalescing behavior in:
#
#  - `harcode_no_ct()` # nolint
#  - `harcode_ct()` # nolint
#  - `assign_no_ct()` # nolint
#  - `assign_ct()` # nolint
#
# Issue 110: https://github.com/pharmaverse/sdtm.oak/issues/110
#

cm_raw <- tibble::tibble(
  PATNUM = c(rep(375L, 2L), 376L, rep(377L, 4L), rep(378L, 4L), rep(379L, 3L)),
  `IT.CMTRT` = c(
    "BABY ASPIRIN", "CORTISPORIN", "ASPIRIN", "DIPHENHYDRAMINE HCL",
    "PARCETEMOL", "VOMIKIND", NA, "AMITRYPTYLINE", "BENADRYL",
    "DIPHENHYDRAMINE HYDROCHLORIDE", "TETRACYCLINE", "BENADRYL", "SOMINEX",
    "ZQUILL"
  ),
  `IT.CMTRTOTH` = c("Other Treatment - ", rep(NA, 5L), "Other Treatment - Baby Aspirin", rep(NA, 7L)),
  `IT.CMINDC` = c(
    NA, "NAUSEA", "ANEMIA", "NAUSEA", "PYREXIA", "VOMITINGS", NA,
    "COLD", "FEVER", NA, "FEVER", "COLD", "COLD", "PAIN"
  ),
  `IT.CMINDCOTH` = c(
    "Other Indication - Vomitting", "Other Indication Fever", rep(NA, 7L),
    "Other Indication - Diarrhoea", rep(NA, 4L)
  ),
  `IT.CMDSTXT` = c("10", "50", NA, "50", NA, "One", NA, "12", "100", "Two", "10", "12", "3", "5"),
  `IT.CMDSTXTO` = c("Other Dose - 100", NA, "Other Dose - 300", NA, "Other Dose - 500", "Other Dose - 600", rep(NA, 8L)), # nolint line_length_linter
  `IT.CMDOSU` = c("mg", "Gram", NA, "mg", "mg", "Tablet", NA, "g", "mg", NA, "mg", "IU", "mL", "%"),
  `IT.DOSUO` = c(rep(NA, 8L), "Other Dose Unit", "cap", rep(NA, 4L))
)

cm_raw <- sdtm.oak:::generate_oak_id_vars(cm_raw, pat_var = "PATNUM", raw_src = "cm_raw")

study_ct <- tibble::tribble(
  ~codelist_code, ~term_code, ~term_value, ~collected_value, ~term_preferred_term,     ~term_synonyms,
  "C71620",       "C25613",   "%",         "%",              "Percentage",             "Percentage",
  "C71620",       "C28253",   "mg",        "mg",             "Milligram",              "Milligram",
  "C71620",       "C28254",   "mL",        "mL",             "Milliliter",             "cm3; Milliliter",
  "C71620",       "C48155",   "g",         "g",              "Gram",                   "Gram",
  "C71620",       "C48480",   "CAPSULE",   "Capsule",        "Capsule Dosing Unit",    "cap; Capsule Dosing Unit",
  "C71620",       "C48542",   "TABLET",    "Tablet",         "Tablet Dosing Unit",     "tab; Tablet Dosing Unit",
  "C71620",       "C48579",   "IU",        "IU",             "International Unit",     "IE; International Unit"
)

cm_actual <-
  # Derive topic variable
  # Map CMTRT using assign_no_ct, raw_var=IT.CMTRT,tgt_var=CMTRT
  assign_no_ct(
    raw_dat = cm_raw,
    raw_var = "IT.CMTRT",
    tgt_var = "CMTRT"
  ) |>
  # example for assign_no_ct
  # Map CMTRT using assign_no_ct, raw_var=IT.CMTRTOTH,tgt_var=CMTRT
  assign_no_ct(
    raw_dat = cm_raw,
    raw_var = "IT.CMTRTOTH",
    tgt_var = "CMTRT"
  ) |>
  # Map CMCAT = "General Concomitant Medications" using hardcode_no_ct
  hardcode_no_ct(
    tgt_val = "General Concomitant Medications",
    raw_dat = cm_raw,
    raw_var = "IT.CMTRT",
    tgt_var = "CMCAT"
  ) |>
  # Map CMCAT = "Other General Concomitant Medications" using hardcode_no_ct
  # example for hardcode_no_ct
  hardcode_no_ct(
    tgt_val = "Other General Concomitant Medications",
    raw_dat = cm_raw,
    raw_var = "IT.CMTRTOTH",
    tgt_var = "CMCAT"
  ) |>
  # Map CMOCCUR = "Y" using hardcode_ct when raw_var = IT.CMTRT
  hardcode_ct(
    tgt_var = "CMOCCUR",
    raw_dat = cm_raw,
    raw_var = "IT.CMTRT",
    tgt_val = "Y",
    ct_spec = study_ct,
    ct_clst = "C71620"
  ) |>
  # Map CMPRESP = "Y" using hardcode_ct when raw_var = IT.CMTRTOTH
  # example for hardcode_ct
  hardcode_ct(
    tgt_var = "CMPRESP",
    raw_dat = cm_raw,
    raw_var = "IT.CMTRTOTH",
    tgt_val = "Y",
    ct_spec = study_ct,
    ct_clst = "C71620"
  ) |>
  # Map CMINDC using assign_no_ct, raw_var=IT.CMINDC,tgt_var=CMINDC
  assign_no_ct(
    raw_dat = cm_raw,
    raw_var = "IT.CMINDC",
    tgt_var = "CMINDC",
    id_vars = oak_id_vars()
  ) |>
  # example for assign_no_ct
  # Map CMINDC using assign_no_ct, raw_var=IT.CMINDCOTH,tgt_var=CMINDC
  assign_no_ct(
    raw_dat = cm_raw,
    raw_var = "IT.CMINDCOTH",
    tgt_var = "CMINDC",
    id_vars = oak_id_vars()
  ) |>
  # Map CMDOSTXT using condition_add and assign_no_ct, raw_var=IT.CMDSTXT,tgt_var=CMDOS
  # If IT.CMDSTXT is numeric, map it to CMDOS
  assign_no_ct(
    raw_dat = condition_add(cm_raw, grepl("^-?\\d*(\\.\\d+)?(e[+-]?\\d+)?$", IT.CMDSTXT)),
    raw_var = "IT.CMDSTXT",
    tgt_var = "CMDOS",
    id_vars = oak_id_vars()
  ) |>
  # Map qualifier CMDOSTXT using condition_add & assign_no_ct, raw_var=IT.CMDSTXT,tgt_var=CMDOSTXT
  # If IT.CMDSTXT is character, map it to CMDOSTXT
  assign_no_ct(
    raw_dat = condition_add(cm_raw, grepl("[^0-9eE.-]", IT.CMDSTXT)),
    raw_var = "IT.CMDSTXT",
    tgt_var = "CMDOSTXT",
    id_vars = oak_id_vars()
  ) |>
  # Map qualifier CMDOSTXT using condition_add & assign_no_ct, raw_var=IT.CMDSTXT,tgt_var=CMDOSTXT
  # If IT.CMDSTXT is character, map it to CMDOSTXT
  assign_no_ct(
    raw_dat = condition_add(cm_raw, !is.na(IT.CMDSTXTO)),
    raw_var = "IT.CMDSTXTO",
    tgt_var = "CMDOSTXT",
    id_vars = oak_id_vars()
  ) |>
  assign_ct(
    raw_dat = cm_raw,
    raw_var = "IT.DOSUO",
    tgt_var = "CMDOSU",
    ct_spec = study_ct,
    ct_clst = "C71620",
    id_vars = oak_id_vars()
  ) |>
  # Map CMDOSU and apply CT using assign_ct, raw_var=IT.CMDOSU,tgt_var=CMDOSU
  assign_ct(
    raw_dat = cm_raw,
    raw_var = "IT.CMDOSU",
    tgt_var = "CMDOSU",
    ct_spec = study_ct,
    ct_clst = "C71620",
    id_vars = oak_id_vars()
  )

cm_expected <-
  tibble::tribble(
    ~oak_id, ~raw_source, ~patient_number, ~CMTRT, ~CMCAT, ~CMOCCUR, ~CMPRESP, ~CMINDC, ~CMDOS, ~CMDOSTXT, ~CMDOSU, # nolint: line_length_linter
    1L, "cm_raw", 375L, "BABY ASPIRIN", "General Concomitant Medications", "Y", "Y", "Other Indication - Vomitting", "10", "Other Dose - 100", "mg", # nolint: line_length_linter
    2L, "cm_raw", 375L, "CORTISPORIN", "General Concomitant Medications", "Y", NA, "NAUSEA", "50", NA, "g", # nolint: line_length_linter
    3L, "cm_raw", 376L, "ASPIRIN", "General Concomitant Medications", "Y", NA, "ANEMIA", NA, "Other Dose - 300", NA, # nolint: line_length_linter
    4L, "cm_raw", 377L, "DIPHENHYDRAMINE HCL", "General Concomitant Medications", "Y", NA, "NAUSEA", "50", NA, "mg", # nolint: line_length_linter
    5L, "cm_raw", 377L, "PARCETEMOL", "General Concomitant Medications", "Y", NA, "PYREXIA", NA, "Other Dose - 500", "mg", # nolint: line_length_linter
    6L, "cm_raw", 377L, "VOMIKIND", "General Concomitant Medications", "Y", NA, "VOMITINGS", NA, "One", "TABLET", # nolint: line_length_linter
    7L, "cm_raw", 377L, "Other Treatment - Baby Aspirin", "Other General Concomitant Medications", NA, "Y", NA, NA, NA, NA, # nolint: line_length_linter
    8L, "cm_raw", 378L, "AMITRYPTYLINE", "General Concomitant Medications", "Y", NA, "COLD", "12", NA, "g", # nolint: line_length_linter
    9L, "cm_raw", 378L, "BENADRYL", "General Concomitant Medications", "Y", NA, "FEVER", "100", NA, "OTHER DOSE UNIT", # nolint: line_length_linter
    10L, "cm_raw", 378L, "DIPHENHYDRAMINE HYDROCHLORIDE", "General Concomitant Medications", "Y", NA, "Other Indication - Diarrhoea", NA, "Two", "CAPSULE", # nolint: line_length_linter
    11L, "cm_raw", 378L, "TETRACYCLINE", "General Concomitant Medications", "Y", NA, "FEVER", "10", NA, "mg", # nolint: line_length_linter
    12L, "cm_raw", 379L, "BENADRYL", "General Concomitant Medications", "Y", NA, "COLD", "12", NA, "IU", # nolint: line_length_linter
    13L, "cm_raw", 379L, "SOMINEX", "General Concomitant Medications", "Y", NA, "COLD", "3", NA, "mL", # nolint: line_length_linter
    14L, "cm_raw", 379L, "ZQUILL", "General Concomitant Medications", "Y", NA, "PAIN", "5", NA, "%" # nolint: line_length_linter
  )

test_that("coalesce behavior works", {
  expect_identical(cm_actual, cm_expected)
})

Try the sdtm.oak package in your browser

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

sdtm.oak documentation built on June 9, 2025, 5:10 p.m.