tests/testthat/test-nested.R

library(dplyr)
library(haven)
library(tibble)

adsl <- cdisc_adsl %>%
  filter(TRT01P != "")

adae <- read_sas("test_data/adae.sas7bdat")

test_that("Row sorting works as expected with and without a descending_by argument", {

  expected <- tibble::tribble(
    ~label,    ~Placebo, ~Xanomeline.High.Dose, ~Xanomeline.Low.Dose, ~row_type, ~nested_level, ~group_level, ~SEX,
    "F", "2 (40.0%)",           "3 (60.0%)",          "1 (20.0%)",  "NESTED",             0,            0,  "F",
    "WHITE", "2 (40.0%)",           "3 (60.0%)",          "1 (20.0%)",  "NESTED",             1,            0,  "F",
    "M", "3 (60.0%)",           "2 (40.0%)",          "4 (80.0%)",  "NESTED",             0,            0,  "M",
    "WHITE", "3 (60.0%)",           "2 (40.0%)",          "4 (80.0%)",  "NESTED",             1,            0,  "M"
  )
  expected$SEX <- factor(expected$SEX)

  expect_equal(nested_freq(adsl,rowvar = "SEX*RACE",colvar = "TRT01P",statlist = statlist("n (x.x%)")),expected,ignore_attr = TRUE)

  expected <- tibble::tribble(
    ~label,    ~Placebo, ~Xanomeline.High.Dose, ~Xanomeline.Low.Dose, ~row_type, ~nested_level, ~group_level, ~SEX,
    "M", "3 (60.0%)",           "2 (40.0%)",          "4 (80.0%)",  "NESTED",             0,            0,  "M",
    "WHITE", "3 (60.0%)",           "2 (40.0%)",          "4 (80.0%)",  "NESTED",             1,            0,  "M",
    "F", "2 (40.0%)",           "3 (60.0%)",          "1 (20.0%)",  "NESTED",             0,            0,  "F",
    "WHITE", "2 (40.0%)",           "3 (60.0%)",          "1 (20.0%)",  "NESTED",             1,            0,  "F"
  )
  expected$SEX <- factor(expected$SEX)

  expect_equal(nested_freq(adsl,
                  rowvar = "SEX*RACE",
                  colvar = "TRT01P",
                  statlist = statlist("n (x.x%)"),
                  descending_by = "Placebo"),
               expected,
               ignore_attr = TRUE)

})

test_that("Three level nested sorting works as expected", {

  adsl <- read_sas("test_data/adsl.sas7bdat") %>%
    filter(SAFFL == "Y") %>%
    mutate(REGION = case_when(SITEGR1 %in% c("716", "718") ~ "EU",
                              TRUE ~ "NE"),
           COUNTRY = case_when(SITEGR1 == "900" ~ "Canada",
                               SITEGR1 %in% c("716", "718") ~ "BEL",
                               TRUE ~ "USA")) %>%
    mutate(TRT01AN = factor(TRT01AN))

  expected <- tibble::tribble(
    ~label,          ~X0,         ~X54,         ~X81, ~row_type, ~nested_level, ~group_level, ~SEX,                              ~RACE,
    "F", "53 (61.6%)", "50 (59.5%)", "40 (47.6%)",  "NESTED",             0,            1,  "F",                                "F",
    "BLACK OR AFRICAN AMERICAN",   "5 (5.8%)",   "6 (7.1%)",   "6 (7.1%)",  "NESTED",             1,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "701",   "2 (2.3%)",   "1 (1.2%)",          "0",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "703",          "0",   "2 (2.4%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "705",   "1 (1.2%)",   "1 (1.2%)",   "2 (2.4%)",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "706",   "1 (1.2%)",          "0",          "0",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "708",   "1 (1.2%)",   "1 (1.2%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "710",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "713",          "0",   "1 (1.2%)",          "0",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "718",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "F",        "BLACK OR AFRICAN AMERICAN",
    "WHITE", "48 (55.8%)", "44 (52.4%)", "34 (40.5%)",  "NESTED",             1,            1,  "F",                            "WHITE",
    "701",   "5 (5.8%)",   "4 (4.8%)",   "6 (7.1%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "702",          "0",   "1 (1.2%)",          "0",  "NESTED",             2,            1,  "F",                            "WHITE",
    "703",   "4 (4.7%)",   "2 (2.4%)",   "3 (3.6%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "704",   "4 (4.7%)",   "5 (6.0%)",   "2 (2.4%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "705",   "4 (4.7%)",   "3 (3.6%)",   "2 (2.4%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "706",          "0",   "1 (1.2%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "707",          "0",   "1 (1.2%)",          "0",  "NESTED",             2,            1,  "F",                            "WHITE",
    "708",   "5 (5.8%)",   "3 (3.6%)",   "4 (4.8%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "709",   "4 (4.7%)",   "5 (6.0%)",   "2 (2.4%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "710",   "8 (9.3%)",   "6 (7.1%)",   "3 (3.6%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "711",          "0",   "1 (1.2%)",   "2 (2.4%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "713",   "1 (1.2%)",   "2 (2.4%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "714",   "2 (2.3%)",   "1 (1.2%)",          "0",  "NESTED",             2,            1,  "F",                            "WHITE",
    "715",   "3 (3.5%)",   "1 (1.2%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "716",   "5 (5.8%)",   "2 (2.4%)",   "6 (7.1%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "717",   "2 (2.3%)",   "2 (2.4%)",          "0",  "NESTED",             2,            1,  "F",                            "WHITE",
    "718",   "1 (1.2%)",   "4 (4.8%)",   "1 (1.2%)",  "NESTED",             2,            1,  "F",                            "WHITE",
    "M", "33 (38.4%)", "34 (40.5%)", "44 (52.4%)",  "NESTED",             0,            1,  "M",                                "M",
    "AMERICAN INDIAN OR ALASKA NATIVE",          "0",          "0",   "1 (1.2%)",  "NESTED",             1,            1,  "M", "AMERICAN INDIAN OR ALASKA NATIVE",
    "701",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "M", "AMERICAN INDIAN OR ALASKA NATIVE",
    "BLACK OR AFRICAN AMERICAN",   "3 (3.5%)",          "0",   "3 (3.6%)",  "NESTED",             1,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "708",   "2 (2.3%)",          "0",          "0",  "NESTED",             2,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "710",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "711",   "1 (1.2%)",          "0",          "0",  "NESTED",             2,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "714",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "718",          "0",          "0",   "1 (1.2%)",  "NESTED",             2,            1,  "M",        "BLACK OR AFRICAN AMERICAN",
    "WHITE", "30 (34.9%)", "34 (40.5%)", "40 (47.6%)",  "NESTED",             1,            1,  "M",                            "WHITE",
    "701",   "7 (8.1%)",   "8 (9.5%)",   "7 (8.3%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "703",   "2 (2.3%)",   "2 (2.4%)",   "2 (2.4%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "704",   "5 (5.8%)",   "3 (3.6%)",   "6 (7.1%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "705",          "0",   "1 (1.2%)",   "2 (2.4%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "707",   "1 (1.2%)",          "0",          "0",  "NESTED",             2,            1,  "M",                            "WHITE",
    "708",   "1 (1.2%)",   "4 (4.8%)",   "3 (3.6%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "709",   "3 (3.5%)",   "2 (2.4%)",   "5 (6.0%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "710",   "3 (3.5%)",   "4 (4.8%)",   "5 (6.0%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "713",   "2 (2.3%)",          "0",   "2 (2.4%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "714",          "0",   "1 (1.2%)",   "1 (1.2%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "715",          "0",   "2 (2.4%)",   "1 (1.2%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "716",   "3 (3.5%)",   "6 (7.1%)",   "2 (2.4%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "717",          "0",          "0",   "3 (3.6%)",  "NESTED",             2,            1,  "M",                            "WHITE",
    "718",   "3 (3.5%)",   "1 (1.2%)",   "1 (1.2%)",  "NESTED",             2,            1,  "M",                            "WHITE"
  )
  expected$SEX <- factor(expected$SEX)


  expect_equal(

      nested_freq(adsl,
                  colvar = "TRT01AN",
                  rowvar = "SEX*RACE*SITEID",
                  statlist = statlist("n (x.x%)", denoms_by = c("TRT01AN"))) %>% mutate(RACE = as.character(RACE)),
      expected,
      ignore_attr = TRUE
  )

})

test_that("nested values can span over higher levels", {
  mtcars2 <- mtcars
  mtcars2$grp <- rep(c("A", "B"), 16)

  expected <- tibble::tribble(
    ~label, ~X4, ~X6, ~X8, ~row_type, ~nested_level, ~group_level, ~grp,
    "A", "5", "2", "9",  "NESTED",             0,            0,  "A",
    "0", "1", "1", "9",  "NESTED",             1,            0,  "A",
    "1", "4", "1", "0",  "NESTED",             1,            0,  "A",
    "B", "6", "5", "5",  "NESTED",             0,            0,  "B",
    "0", "0", "2", "5",  "NESTED",             1,            0,  "B",
    "1", "6", "3", "0",  "NESTED",             1,            0,  "B"
  )
  expected$grp <- factor(expected$grp)
  expect_equal(

      nested_freq(
        mtcars2,
        colvar= "cyl",
        rowvar = "grp*vs",
        statlist = statlist("n", distinct = FALSE)
    ),
    expected,
    ignore_attr = TRUE
  )

  expected <- tibble::tribble(
    ~label, ~X4, ~X6, ~X8, ~row_type, ~nested_level, ~group_level, ~grp,
    "A", "5", "2", "9",  "NESTED",             0,            0,  "A",
    "0", "1", "1", "9",  "NESTED",             1,            0,  "A"
  )
  expected$grp <- factor(expected$grp)

  expect_equal(

      nested_freq(
        mtcars2,
        colvar = "cyl",
        rowvar = "grp*vs",
        statlist = statlist("n", distinct = FALSE),
        cutoff = "8 >= 6",
        cutoff_stat = "n"

    ),
    expected,
    ignore_attr = TRUE
  )

  expected <- tibble::tribble(
    ~label, ~X4, ~X6, ~X8, ~row_type, ~nested_level, ~group_level, ~grp, ~vs, ~carb,
    "A", "2", "0", "-",  "NESTED",             0,            1,  "A", "A",   "1",
    "0", "1", "0", "-",  "NESTED",             2,            1,  "A", "1",   "1",
    "1", "2", "0", "-",  "NESTED",             1,            1,  "A", "1",   "1",
    "1", "1", "0", "-",  "NESTED",             2,            1,  "A", "1",   "1",
    "A", "3", "-", "3",  "NESTED",             0,            1,  "A", "A",   "2",
    "0", "1", "-", "3",  "NESTED",             1,            1,  "A", "0",   "2",
    "0", "0", "-", "3",  "NESTED",             2,            1,  "A", "0",   "2",
    "1", "1", "-", "0",  "NESTED",             2,            1,  "A", "0",   "2",
    "0", "1", "-", "0",  "NESTED",             2,            1,  "A", "1",   "2",
    "1", "2", "-", "0",  "NESTED",             1,            1,  "A", "1",   "2",
    "1", "1", "-", "0",  "NESTED",             2,            1,  "A", "1",   "2",
    "A", "-", "-", "1",  "NESTED",             0,            1,  "A", "A",   "3",
    "0", "-", "-", "1",  "NESTED",             1,            1,  "A", "0",   "3",
    "0", "-", "-", "1",  "NESTED",             2,            1,  "A", "0",   "3",
    "A", "-", "2", "4",  "NESTED",             0,            1,  "A", "A",   "4",
    "0", "-", "1", "4",  "NESTED",             1,            1,  "A", "0",   "4",
    "0", "-", "0", "3",  "NESTED",             2,            1,  "A", "0",   "4",
    "1", "-", "1", "1",  "NESTED",             2,            1,  "A", "0",   "4",
    "0", "-", "1", "0",  "NESTED",             2,            1,  "A", "1",   "4",
    "1", "-", "1", "0",  "NESTED",             1,            1,  "A", "1",   "4",
    "1", "-", "0", "0",  "NESTED",             2,            1,  "A", "1",   "4",
    "A", "-", "-", "1",  "NESTED",             0,            1,  "A", "A",   "8",
    "0", "-", "-", "1",  "NESTED",             1,            1,  "A", "0",   "8",
    "0", "-", "-", "0",  "NESTED",             2,            1,  "A", "0",   "8",
    "1", "-", "-", "1",  "NESTED",             2,            1,  "A", "0",   "8",
    "B", "3", "2", "-",  "NESTED",             0,            1,  "B", "B",   "1",
    "0", "0", "2", "-",  "NESTED",             2,            1,  "B", "1",   "1",
    "1", "3", "2", "-",  "NESTED",             1,            1,  "B", "1",   "1",
    "1", "3", "0", "-",  "NESTED",             2,            1,  "B", "1",   "1",
    "B", "3", "-", "1",  "NESTED",             0,            1,  "B", "B",   "2",
    "0", "0", "-", "1",  "NESTED",             1,            1,  "B", "0",   "2",
    "0", "0", "-", "1",  "NESTED",             2,            1,  "B", "0",   "2",
    "0", "1", "-", "0",  "NESTED",             2,            1,  "B", "1",   "2",
    "1", "3", "-", "0",  "NESTED",             1,            1,  "B", "1",   "2",
    "1", "2", "-", "0",  "NESTED",             2,            1,  "B", "1",   "2",
    "B", "-", "-", "2",  "NESTED",             0,            1,  "B", "B",   "3",
    "0", "-", "-", "2",  "NESTED",             1,            1,  "B", "0",   "3",
    "0", "-", "-", "2",  "NESTED",             2,            1,  "B", "0",   "3",
    "B", "-", "2", "2",  "NESTED",             0,            1,  "B", "B",   "4",
    "0", "-", "1", "2",  "NESTED",             1,            1,  "B", "0",   "4",
    "0", "-", "0", "2",  "NESTED",             2,            1,  "B", "0",   "4",
    "1", "-", "1", "0",  "NESTED",             2,            1,  "B", "0",   "4",
    "0", "-", "1", "0",  "NESTED",             2,            1,  "B", "1",   "4",
    "1", "-", "1", "0",  "NESTED",             1,            1,  "B", "1",   "4",
    "1", "-", "0", "0",  "NESTED",             2,            1,  "B", "1",   "4",
    "B", "-", "1", "-",  "NESTED",             0,            1,  "B", "B",   "6",
    "0", "-", "1", "-",  "NESTED",             1,            1,  "B", "0",   "6",
    "0", "-", "0", "-",  "NESTED",             2,            1,  "B", "0",   "6",
    "1", "-", "1", "-",  "NESTED",             2,            1,  "B", "0",   "6"
  )

  expected$grp <- factor(expected$grp)
  expected$carb <- factor(expected$carb)

  expect_equal(
      nested_freq(
        mtcars2,
        colvar = "cyl",
        rowvar = "grp*vs*am",
        statlist = statlist("n", denoms_by = c("cyl", "carb"), distinct = FALSE),
        tablebyvar = "carb"

    ) %>% mutate(vs = as.character(vs)),
    expected,
    ignore_attr = TRUE
  )
})



test_that("subValues in a nested count layer should respect rowbyvar", {
  # If a value is found in one table by var but not another it should only be
  # found in one tablebyvar

  mtcars2 <- mtcars %>%
    rownames_to_column(var = "USUBJID")
  mtcars2$grp <- rep(c("A", "B"), length.out = 32)

  expected <- tibble::tribble(
    ~label,        ~X3,        ~X4,        ~X5, ~row_type, ~nested_level, ~group_level, ~carb, ~grp,
    "A",  "1 (6.7)",  "1 (8.3)",        "0",  "NESTED",             0,            1,   "1",  "A",
    "4",  "1 (6.7)",  "1 (8.3)",        "0",  "NESTED",             1,            1,   "1",  "A",
    "A", "3 (20.0)", "2 (16.7)", "1 (20.0)",  "NESTED",             0,            1,   "2",  "A",
    "4",        "0", "2 (16.7)", "1 (20.0)",  "NESTED",             1,            1,   "2",  "A",
    "8", "3 (20.0)",        "0",        "0",  "NESTED",             1,            1,   "2",  "A",
    "A",  "1 (6.7)",        "0",        "0",  "NESTED",             0,            1,   "3",  "A",
    "8",  "1 (6.7)",        "0",        "0",  "NESTED",             1,            1,   "3",  "A",
    "A", "3 (20.0)", "2 (16.7)", "1 (20.0)",  "NESTED",             0,            1,   "4",  "A",
    "6",        "0", "2 (16.7)",        "0",  "NESTED",             1,            1,   "4",  "A",
    "8", "3 (20.0)",        "0", "1 (20.0)",  "NESTED",             1,            1,   "4",  "A",
    "A",        "0",        "0", "1 (20.0)",  "NESTED",             0,            1,   "8",  "A",
    "8",        "0",        "0", "1 (20.0)",  "NESTED",             1,            1,   "8",  "A",
    "B", "2 (13.3)", "3 (25.0)",        "0",  "NESTED",             0,            1,   "1",  "B",
    "4",        "0", "3 (25.0)",        "0",  "NESTED",             1,            1,   "1",  "B",
    "6", "2 (13.3)",        "0",        "0",  "NESTED",             1,            1,   "1",  "B",
    "B",  "1 (6.7)", "2 (16.7)", "1 (20.0)",  "NESTED",             0,            1,   "2",  "B",
    "4",        "0", "2 (16.7)", "1 (20.0)",  "NESTED",             1,            1,   "2",  "B",
    "8",  "1 (6.7)",        "0",        "0",  "NESTED",             1,            1,   "2",  "B",
    "B", "2 (13.3)",        "0",        "0",  "NESTED",             0,            1,   "3",  "B",
    "8", "2 (13.3)",        "0",        "0",  "NESTED",             1,            1,   "3",  "B",
    "B", "2 (13.3)", "2 (16.7)",        "0",  "NESTED",             0,            1,   "4",  "B",
    "6",        "0", "2 (16.7)",        "0",  "NESTED",             1,            1,   "4",  "B",
    "8", "2 (13.3)",        "0",        "0",  "NESTED",             1,            1,   "4",  "B",
    "B",        "0",        "0", "1 (20.0)",  "NESTED",             0,            1,   "6",  "B",
    "6",        "0",        "0", "1 (20.0)",  "NESTED",             1,            1,   "6",  "B"
  )

  expected$grp <- factor(expected$grp)
  expected$carb <- factor(expected$carb)

  expect_equal(

      nested_freq(
        mtcars2,
        colvar = "gear",
        rowvar = "grp*cyl",
        rowbyvar = "carb"
      ),
      expected,
      ignore_attr = TRUE
  )

})

Try the tidytlg package in your browser

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

tidytlg documentation built on June 22, 2024, 10:43 a.m.