Nothing
#' Require cohort subjects are present in another clinical table
#'
#' @description
#' `requireTableIntersect()` filters a cohort table based on a requirement
#' that an individual is seen (or not seen) to have a record (or no records) in
#' a clinical table in some time window around an index date.
#'
#' @inheritParams requireIntersectDoc
#' @inheritParams cohortDoc
#' @inheritParams cohortIdModifyDoc
#' @inheritParams windowDoc
#' @inheritParams nameDoc
#' @inheritParams softValidationDoc
#'
#' @return Cohort table with only those in the other table kept (or those that
#' are not in the table if negate = TRUE)
#'
#' @export
#'
#' @examples
#' \donttest{
#' library(CohortConstructor)
#' cdm <- mockCohortConstructor(drugExposure = TRUE)
#' cdm$cohort1 |>
#' requireTableIntersect(tableName = "drug_exposure",
#' indexDate = "cohort_start_date",
#' window = c(-Inf, 0))
#' }
requireTableIntersect <- function(cohort,
tableName,
window,
intersections = c(1, Inf),
cohortId = NULL,
indexDate = "cohort_start_date",
targetStartDate = startDateColumn(tableName),
targetEndDate = endDateColumn(tableName),
inObservation = TRUE,
censorDate = NULL,
name = tableName(cohort),
.softValidation = TRUE) {
# checks
name <- omopgenerics::validateNameArgument(name, validation = "warning")
cohort <- omopgenerics::validateCohortArgument(cohort)
validateCohortColumn(indexDate, cohort, class = "Date")
cdm <- omopgenerics::validateCdmArgument(omopgenerics::cdmReference(cohort))
window <- omopgenerics::validateWindowArgument(window)
cohortId <- omopgenerics::validateCohortIdArgument({{cohortId}}, cohort, validation = "warning")
intersections <- validateIntersections(intersections)
omopgenerics::assertCharacter(tableName)
omopgenerics::assertLogical(.softValidation)
if (length(cohortId) == 0) {
cli::cli_inform("Returning entry cohort as `cohortId` is not valid.")
# return entry cohort as cohortId is used to modify not subset
cdm[[name]] <- cohort |> dplyr::compute(name = name, temporary = FALSE,
logPrefix = "CohortConstructor_requireTableIntersect_entry_")
return(cdm[[name]])
}
lower_limit <- as.integer(intersections[[1]])
upper_limit <- intersections[[2]]
upper_limit[is.infinite(upper_limit)] <- 999999L
upper_limit <- as.integer(upper_limit)
window_start <- window[[1]][1]
window_end <- window[[1]][2]
if (length(tableName) > 1) {
cli::cli_abort("Currently just one table supported.")
}
# temp tables
tablePrefix <- omopgenerics::tmpPrefix()
tmpNewCohort <- omopgenerics::uniqueTableName(tablePrefix)
tmpUnchanged <- omopgenerics::uniqueTableName(tablePrefix)
cdm <- filterCohortInternal(cdm, cohort, cohortId, tmpNewCohort, tmpUnchanged)
newCohort <- cdm[[tmpNewCohort]]
intersectCol <- uniqueColumnName(newCohort)
newCohort <- newCohort |>
PatientProfiles::addTableIntersectCount(
tableName = tableName,
indexDate = indexDate,
targetStartDate = targetStartDate,
targetEndDate = targetEndDate,
window = window,
censorDate = censorDate,
inObservation = inObservation,
nameStyle = intersectCol,
name = tmpNewCohort
) |>
dplyr::filter(
.data[[intersectCol]] >= .env$lower_limit &
.data[[intersectCol]] <= .env$upper_limit
) |>
dplyr::select(!dplyr::all_of(intersectCol)) |>
dplyr::compute(
name = tmpNewCohort, temporary = FALSE,
logPrefix = "CohortConstructor_requireTableIntersect_subset_"
)
# attrition reason
if (all(intersections == 0)) {
reason <- glue::glue(
"Not in table {tableName} between {window_start} & ",
"{window_end} days relative to {indexDate}"
)
} else if (intersections[[1]] != intersections[[2]]) {
reason <- glue::glue(
"In table {tableName} between {window_start} & ",
"{window_end} days relative to {indexDate} between ",
"{intersections[[1]]} and {intersections[[2]]}"
)
} else {
reason <- glue::glue(
"In table {tableName} between {window_start} & ",
"{window_end} days relative to {indexDate} ",
"{intersections[[1]]} times"
)
}
if (!is.null(censorDate)) {
reason <- glue::glue("{reason}, censoring at {censorDate}")
}
if (isTRUE(needsIdFilter(cohort, cohortId))) {
newCohort <- newCohort |>
# join non modified cohorts
dplyr::union_all(cdm[[tmpUnchanged]]) |>
dplyr::compute(
name = tmpNewCohort, temporary = FALSE,
logPrefix = "CohortConstructor_requireTableIntersect_union_"
)
}
newCohort <- newCohort |>
dplyr::compute(
name = name, temporary = FALSE,
logPrefix = "CohortConstructor_requireTableIntersect_name_"
) |>
omopgenerics::newCohortTable(.softValidation = .softValidation) |>
omopgenerics::recordCohortAttrition(reason = reason, cohortId = cohortId)
omopgenerics::dropSourceTable(cdm = cdm, name = dplyr::starts_with(tablePrefix))
useIndexes <- getOption("CohortConstructor.use_indexes")
if (!isFALSE(useIndexes)) {
addIndex(
cohort = newCohort,
cols = c("subject_id", "cohort_start_date")
)
}
return(newCohort)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.