insightsengineering / insightsengineering/teal.transform

When two columns have the same name: data_merge_module renames them in an unpredictable way

Open
#31 3 comments 0 reactions 0 assignees View on GitHub
core
Dominant language
R
Stars
2
Forks
3
PR merge metrics
No merged PRs in 30d

Description

to reproduce:

```r
library(random.cdisc.data)
library(teal.module.clinical)
ADSL <- radsl(cached = TRUE)
ADAE <- radae(cached = TRUE)
ADCM <- radcm(cached = TRUE)

#' Modify ADCM
ADCM$CMINDC <- paste0("Indication_", as.numeric(ADCM$CMDECOD))
ADCM$CMDOSE <- 1
ADCM$CMTRT <- ADCM$CMCAT
ADCM$CMDOSU <- "U"
ADCM$CMROUTE <- "CMROUTE"
ADCM$CMDOSFRQ <- "CMDOSFRQ"
ADCM$CMSTDY <- 1
ADCM[ADCM$CMCAT == "medcl B", ]$CMSTDY <- 20
ADCM[ADCM$CMCAT == "medcl C", ]$CMSTDY <- 150
ADCM$CMENDY <- 500
ADCM[ADCM$CMCAT == "medcl B", ]$CMENDY <- 700
ADCM[ADCM$CMCAT == "medcl C", ]$CMENDY <- 1000
ADCM$CMASTDTM <- ADCM$ASTDTM
ADCM$CMAENDTM <- ADCM$AENDTM
rtables::var_labels(
ADCM[c("CMINDC", "CMTRT", "CMSTDY", "CMENDY")]
) <- c(
"Indication",
"Reported Name of Drug, Med, or Therapy",
"Study Day of Start of Medication",
"Study Day of End of Medication"
)
adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4")

app <- init(
data = cdisc_data(
cdisc_dataset("ADSL", ADSL, code = "ADSL <- radsl(cached = TRUE)"),
cdisc_dataset("ADAE", ADAE, code = "ADAE <- radae(cached = TRUE)"),
cdisc_dataset("ADCM", ADCM,
code = 'ADCM <- radcm(cached = TRUE)
ADCM$CMINDC <- paste0("Indication_", as.numeric(ADCM$CMDECOD))
ADCM$CMDOSE <- 1
ADCM$CMTRT <- ADCM$CMCAT
ADCM$CMDOSU <- "U"
ADCM$CMROUTE <- "CMROUTE"
ADCM$CMDOSFRQ <- "CMDOSFRQ"
ADCM$CMSTDY <- 1
ADCM[ADCM$CMCAT == "medcl B", ]$CMSTDY <- 20
ADCM[ADCM$CMCAT == "medcl C", ]$CMSTDY <- 150
ADCM$CMENDY <- 500
ADCM[ADCM$CMCAT == "medcl B", ]$CMENDY <- 700
ADCM[ADCM$CMCAT == "medcl C", ]$CMENDY <- 1000
ADCM$CMASTDTM <- ADCM$ASTDTM
ADCM$CMAENDTM <- ADCM$AENDTM
rtables::var_labels(
ADCM[c("CMINDC", "CMTRT", "CMSTDY", "CMENDY")]) <- c(
"Indication",
"Reported Name of Drug, Med, or Therapy",
"Study Day of Start of Medication",
"Study Day of End of Medication")',
keys = adcm_keys
),
check = TRUE
),
modules = root_modules(
tm_g_pp_patient_timeline(
label = "Vitals",
dataname_adae = "ADAE",
dataname_adcm = "ADCM",
parentname = "ADSL",
patient_col = "USUBJID",
plot_height = c(600L, 200L, 2000L),
cmtrt = choices_selected(
choices = variable_choices(ADCM, "CMTRT"),
selected = "CMTRT",
),
aeterm = choices_selected(
choices = variable_choices(ADAE, "AETERM"),
selected = c("AETERM")
),
aetime_start = choices_selected(
choices = variable_choices(ADAE, "ASTDTM"),
selected = c("ASTDTM")
),
aetime_end = choices_selected(
choices = variable_choices(ADAE, "AENDTM"),
selected = c("AENDTM")
),
dstime_start = choices_selected(
choices = variable_choices(ADCM, "CMASTDTM"),
selected = c("CMASTDTM")
),
dstime_end = choices_selected(
choices = variable_choices(ADCM, "CMAENDTM"),
selected = c("CMAENDTM")
),
aerelday_start = choices_selected(
choices = variable_choices(ADAE, "ASTDY"),
selected = c("ASTDY")
),
aerelday_end = choices_selected(
choices = variable_choices(ADAE, "AENDY"),
selected = c("AENDY")
),
dsrelday_start = choices_selected(
choices = variable_choices(ADCM, "ASTDY"),
selected = c("ASTDY")
),
dsrelday_end = choices_selected(
choices = variable_choices(ADCM, "AENDY"),
selected = c("AENDY")
)
)
)
)

shinyApp(app$ui, app$server)
```

Notice that `ASTDY` and `AENDY` are columns that are passed in from both `ADAE` and `ADCM`

![image](https://user-images.githubusercontent.com/12943682/128363519-e350b5ea-1be4-4013-a2c4-7ddd619975d4.png)

Inside of `srv_g_patient_timeline`:

```r
p_timeline_merged_data <- data_merge_module(
datasets = datasets,
data_extract = list(
dsrelday_start, dsrelday_end,
aerelday_start, aerelday_end,
aeterm, aetime_start,
aetime_end, dstime_start, dstime_end, cmtrt),
input_id = c(
"dsrelday_start", "dsrelday_end",
"aerelday_start", "aerelday_end",
"aeterm", "aetime_start",
"aetime_end", "dstime_start", "dstime_end", "cmtrt")
)
```

If you press the Show R code button on the app:

![image](https://user-images.githubusercontent.com/12943682/128363542-2d32814b-574a-4a01-a2c1-f8f4b646b357.png)

`data_merge_module` tries to resolve this conflict by renaming. However, the renaming is unpredictable.

If instead, the developer rearranges the order:

```r
p_timeline_merged_data <- data_merge_module(
datasets = datasets,
data_extract = list(
aeterm, aetime_start,
aetime_end, dstime_start, dstime_end, cmtrt,
dsrelday_start, dsrelday_end,
aerelday_start, aerelday_end),
input_id = c(
"aeterm", "aetime_start",
"aetime_end", "dstime_start", "dstime_end", "cmtrt",
"dsrelday_start", "dsrelday_end",
"aerelday_start", "aerelday_end")
)
```

Pressing SRC:

![image](https://user-images.githubusercontent.com/12943682/128363567-58b6e4c1-9a74-43db-be84-d0a8beb1fb1e.png)

Solution:

ASTDY -> ADAE.ASTDY
AENDY -> ADAE.AENDY

ASTDY -> ADCM.ASTDY
AENDY -> ADCM.AENDY

This actually makes more sense, too.

Provenance:
```
Creator: junlue
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.