view center_scale.R @ 3:b7daf62bde65 draft default tip

planemo upload for repository https://github.com/ARTbio/tools-artbio/tree/main/tools/gsc_center_scale commit 44d7e1048de3a58983e0559581264147090fefb0
author artbio
date Thu, 07 Nov 2024 18:54:17 +0000
parents 163befe5f05b
children
line wrap: on
line source

options(
    show.error.messages = FALSE,
    error = function() {
        cat(geterrmessage(), file = stderr())
        q("no", 1, FALSE)
    }
)
loc <- Sys.setlocale("LC_MESSAGES", "en_US.UTF-8")
warnings()
library(optparse)

# Arguments
option_list <- list(
    make_option(
        "--data",
        default = NA,
        type = "character",
        help = "Input file that contains values to transform. Must be tabular separated,
            with columns and row names, variables in rows, observations in columns  [default : '%default' ]"
    ),
    make_option(
        "--center",
        default = TRUE,
        type = "logical",
        help = "center data to the mean [default : '%default' ]"
    ),
    make_option(
        "--scale",
        default = TRUE,
        type = "logical",
        help = "scale data to standard deviation [default : '%default' ]"
    ),
    make_option(
        "--factor",
        default = "",
        type = "character",
        help = "A two-column observations|factor_levels table, to group observations to be transformed by levels  [default : '%default' ]"
    ),
    make_option(
        "--output",
        default = "res.tab",
        type = "character",
        help = "Table of transformed values [default : '%default' ]"
    )
)

transform <- function(df, center = TRUE, scale = TRUE) {
    transfo <- scale(t(df),
        center = center,
        scale = scale
    )
    return(as.data.frame(t(transfo)))
}

opt <- parse_args(OptionParser(option_list = option_list),
    args = commandArgs(trailingOnly = TRUE)
)

data <- read.delim(
    opt$data,
    check.names = FALSE,
    header = TRUE,
    row.names = 1,
    sep = "\t"
)

if (opt$factor != "") {
    data_factor <- read.delim(
        opt$factor,
        check.names = FALSE,
        header = TRUE,
        sep = "\t",
        stringsAsFactors = TRUE
    )
    colnames(data_factor) <- c("cellid", "level")
    data_transformed <- data.frame(row.names = rownames(data))
    for (group in levels(data_factor$level)) {
        subcells <- as.data.frame(subset(data_factor, level == group, select = cellid))
        subdata <- as.data.frame(subset(data, select = as.vector(subcells$cellid)))
        subdata_transformed <- transform(subdata,
            center = as.logical(opt$center),
            scale = as.logical(opt$scale)
        )
        data_transformed <- cbind(data_transformed, subdata_transformed)
    }
} else {
    data_transformed <- transform(data,
        center = as.logical(opt$center),
        scale = as.logical(opt$scale)
    )
}


write.table(
    cbind(gene = rownames(data_transformed), data_transformed),
    opt$output,
    col.names = TRUE,
    row.names = FALSE,
    quote = FALSE,
    sep = "\t"
)