---
title: "Applying a Variable Date Cut"
output: 
  rmarkdown::html_vignette
    
vignette: >
  %\VignetteIndexEntry{Applying a Variable Date Cut}
  %\VignetteEngine{knitr::rmarkdown}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

# Introduction

This article describes how to apply a data cut, when the date to apply is not the more common singular 
date, but a different date per patient. An example would be to cut all patients data at their week 24 visit date. The below is an example how this can be done utilizing `datacutr`.

# Programming Flow

* [Read in Data](#readdata)
* [Create DCUT Dataset](#dcut)
* [Postprocess DCUT](#postprocess)

## Read in Data {#readdata}

To start, all SDTM data needs to be stored in a list.

```{r, message=FALSE, warning=FALSE}
library(datacutr)
library(admiraldev)
library(dplyr)
library(lubridate)
library(stringr)
library(purrr)
library(rlang)

source_data <- list(
  ds = datacutr_ds, dm = datacutr_dm, ae = datacutr_ae, sc = datacutr_sc,
  lb = datacutr_lb, fa = datacutr_fa, ts = datacutr_ts
)
```

## Create DCUT Dataset {#dcut}

The next step is to create the `DCUT` dataset containing the description, and a fixed date that ensures all data necessary from `ds` is included into `DCUT`. An example would be today's date.
```{r, message=FALSE, warning=FALSE}
dcut <- create_dcut(
  dataset_ds = source_data$ds,
  ds_date_var = DSSTDTC,
  filter = DSDECOD == "RANDOMIZATION",
  cut_date = as.character(lubridate::today()),
  cut_description = "Week 24 Cut"
)
```


```{r, eval=TRUE, echo=FALSE}
dataset_vignette(
  dcut,
  display_vars = exprs(USUBJID, DCUTDTC, DCUTDTM, DCUTDESC)
)
```

## Postprocess DCUT {#postprocess}

The next step is to update `DCUT` with the required date per patient required for the variable cut. An example is below using the trial visits as source. If the required event has not been observed, keeping `DCUT.DCUTDTC` as the future/today date ensures all data is kept within the cut for that patient.

```{r, message=FALSE, warning=FALSE}
sv <- tibble::tribble(
  ~USUBJID, ~VISIT, ~SVSTDTC,
  "AB12345-001", "WEEK24", "2022-06-01",
  "AB12345-002", "WEEK24", "2022-06-30",
  "AB12345-003", "WEEK24", "2022-07-01",
  "AB12345-004", "WEEK24", "2022-05-04",
)

dcut <- dcut %>%
  left_join(sv %>%
    filter(VISIT == "WEEK24") %>%
    select(USUBJID, SVSTDTC)) %>%
  mutate(DCUTDTC = as.character(ifelse(!is.na(SVSTDTC), SVSTDTC, as.character(DCUTDTC)))) %>%
  impute_dcutdtc(dsin = ., varin = DCUTDTC, varout = DCUTDTM)
```
```{r, eval=TRUE, echo=FALSE}
dataset_vignette(
  dcut,
  display_vars = exprs(USUBJID, DCUTDTC, DCUTDTM, DCUTDESC)
)
```

Now that `DCUT` is prepared, the rest of the process follows the same as previously prescribed using either the wrapped function approach [Link](https://pharmaverse.github.io/datacutr/articles/wrapper.html#processcut) or modular approach [Link](https://pharmaverse.github.io/datacutr/articles/modular.html#preprocess)
