insightsengineering / insightsengineering/teal.transform
When two columns have the same name: data_merge_module renames them in an unpredictable way
- 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`

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:

`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:

Solution:
ASTDY -> ADAE.ASTDY
AENDY -> ADAE.AENDY
ASTDY -> ADCM.ASTDY
AENDY -> ADCM.AENDY
This actually makes more sense, too.
Provenance:
```
Creator: junlue
```
Contributor guide
Assessment
This issue has not been assessed yet.