diff --git a/R/concept-load.R b/R/concept-load.R index 2f2c6d7e..66b22c35 100644 --- a/R/concept-load.R +++ b/R/concept-load.R @@ -560,9 +560,11 @@ load_concepts.itm <- function(x, patient_ids = NULL, id_type = "icustay", res <- merge_patid(res, patient_ids) res <- do_callback(x, res) - if (is_ts_tbl(res)) { + if (is_win_tbl(res)) { + res <- change_interval(res, interval, c(index_var(res), dur_var(res)), by_ref = TRUE) + } else if (is_ts_tbl(res)) { res <- change_interval(res, interval, index_var(res), by_ref = TRUE) - } + } res } diff --git a/R/data-load.R b/R/data-load.R index 711f6d43..c4e04594 100644 --- a/R/data-load.R +++ b/R/data-load.R @@ -440,7 +440,7 @@ load_win.src_tbl <- function(x, rows, cols = colnames(x), id_var = id_vars(x), time_vars <- setdiff(intersect(time_vars, colnames(res)), dur_var) res <- change_id(res, id_var, x, cols = time_vars, keep_old_id = FALSE) - res <- change_interval(res, interval, time_vars, by_ref = TRUE) + res <- change_interval(res, interval, c(time_vars, dur_var), by_ref = TRUE) res } diff --git a/R/data-utils.R b/R/data-utils.R index 3e1020d5..7a6aa445 100644 --- a/R/data-utils.R +++ b/R/data-utils.R @@ -689,6 +689,34 @@ upgrade_id.ts_tbl <- function(x, target_id, src, cols = time_vars(x), ...) { res } +#' @rdname change_id +#' @export +#' +upgrade_id.win_tbl <- function(x, target_id, src, cols = time_vars(x), ...) { + + assert_that(index_var(x) %in% cols) + + if (!is_one_min(interval(x))) { + warn_ricu("Changing the ID of non-minute resolution data will change the + interval to 1 minute", class = "non_min_id_change") + } + + sft <- new_names(x) + idx <- index_var(x) + dur <- dur_var(x) + + map <- id_map(src, id_vars(x), target_id, sft, idx) + + res <- map[x, on = c(id_vars(x), index_var(x)), roll = -Inf, rollends = TRUE] + res <- res[, c(cols) := lapply(.SD, `-`, get(sft)), .SDcols = cols] + + res <- as_win_tbl(res, target_id, idx, mins(1L), dur, by_ref = TRUE) + res <- rm_cols(res, sft, by_ref = TRUE) + + res +} + + #' @rdname change_id #' @export #' diff --git a/R/tbl-utils.R b/R/tbl-utils.R index ad40ba51..be042cdf 100644 --- a/R/tbl-utils.R +++ b/R/tbl-utils.R @@ -501,9 +501,7 @@ change_interval <- function(x, new_interval, cols = time_vars(x), assert_that(is_scalar(new_interval), is_interval(new_interval), is.flag(by_ref)) - if (!length(cols) || - (is_ts_tbl(x) && all_equal(interval(x), new_interval))) { - + if (!length(cols)) { return(x) }