#' Merge vertically split data
#'
#' This function can be used when the MACRO dataset is \strong{vertically} split,
#' and must not be used to combine horizontally split data which has same
#' variable names. It will rename the variable of the dataset, including
#' shortcode of dlu and clu files with underscore and number, and combine them
#' to single dataset. Returns a list with merged dataset, DLU and CLU. Data, DLU
#' and CLU should be in same order. The merged dataset, dlu and clu can further
#' be passed to \code{\link{apply_macro_dict}}.
#'
#' @param datalist A list of dataset
#' @param dlulist A list of DLU data
#' @param clulist A list of CLU data
#'
#' @return A list of three data.frame
#' \itemize{
#' \item{data}: Merged dataset.
#' \item{dlu}: Merged DLU data.
#' \item{clu}: Merged CLU data.
#' }
#' @export
#'
#' @seealso
#' \code{\link{read_data}}
#' \code{\link{apply_macro_dict}}
#'
#' @example inst/examples/merge-data.R
merge_data <- function(datalist,
dlulist,
clulist) {
# Column names that is common across studies and datasets.
com_cols <- c(
"Trial", "Site", "Label", "PersonId", "VisitCycle",
"FormCycle", "RepeatNumber"
)
for (i in seq_along(datalist)) {
if (!all(com_cols %in% names(datalist[[i]]))) {
stop(
"The ", i, "th data in the datalist does not contain all the following variables: ",
paste(com_cols, collapse = ", ")
)
}
if (!all(dlulist[[i]][, 1] %in% names(datalist[[i]]))) {
warning(
"Not all the short code in the ", i,
"th DLU can be found in the data ", i
)
}
if (!all(clulist[[i]][, 1] %in% names(datalist[[i]]))) {
warning(
"Not all the short code in the ", i,
"th CLU can be found in the data ", i
)
}
nams <- setdiff(colnames(datalist[[i]]), com_cols)
datalist[[i]] <- data.table::copy(datalist[[i]])
data.table::setnames(datalist[[i]], nams, paste(nams, i, sep = "_"))
# Rename DLU shortcode
dlu_nams <- dlulist[[i]][dlulist[[i]][, 1] %in% nams, 1]
dlulist[[i]][dlulist[[i]][, 1] %in% nams, 1] <- paste(dlu_nams, i,
sep = "_"
)
# Rename CLU shortcode
clu_nams <- clulist[[i]][clulist[[i]][, 1] %in% nams, 1]
clulist[[i]][clulist[[i]][, 1] %in% nams, 1] <- paste(clu_nams, i,
sep = "_"
)
}
dlu <- unique(do.call(rbind, dlulist))
clu <- unique(do.call(rbind, clulist))
dt <- Reduce(
function(df1, df2) merge(df1, df2, by = com_cols, all = TRUE, sort = FALSE),
datalist
)
list(data = dt, dlu = dlu, clu = clu)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.