OpasnetUtils/Convert.units
Moderator:Nobody (see all) Click here to sign up. |
This page is a stub. You may improve it into a full page. |
Upload data
|
Description
A function that converts units from one to another, if possible.
Parameters
- x = a numeric vector with values to be converted
- tounit = a character vector of the new units to be used. Must be found from the To column from the table in Unit conversions.
- fromunit = a character vector or factor with the current units
Code
# SETMETHOD CONVERT.UNITS####################################################3 ############# convert.units: a function that converts units from one to another, if possible. # x = a numeric vector with values to be converted # tounit = a character vector of the new units to be used. Must be found from the To column from the table in [[Unit conversions]]. # fromunit = a character vector or factor with the current units convert.units <- function(x, tounit = c("kg", "s", "m", "m3", "J", "W", "A", "V", "C", "N", "Pa", "Hz", "mol"), fromunit = NULL) { if(is.null(tounit)) {tounit <- c("kg", "s", "m", "m3", "J", "W", "A", "V", "C", "N", "Pa", "Hz", "mol")} if(is.null(fromunit)) { # Do nothing if from-units are not defined. out <- data.frame(Unit = fromunit, Result = x) } else { conversions <- fetch("Op_en5475") # Set up a full unit conversion table. conversions$Result <- as.numeric(conversions$Result) colnames(conversions)[colnames(conversions) == "type"] <- "Type" prefixes <- conversions[conversions$Type == "Prefix", ] # Combine all prefixes with all units in From column. colnames(prefixes) <- paste("Prefix.", colnames(prefixes), sep = "") conversions <- merge(prefixes, conversions[conversions$Type == "Unit", ]) conversions$From <- paste(conversions$Prefix.From, conversions$From, sep = "") conversions$Result <- conversions$Result * conversions$Prefix.Result conversions <- conversions[c("From", "To", "Result")] conversions <- merge(conversions, conversions, by = "To") # Create all possible from-to pairs. conversions$Result <- conversions$Result.x / conversions$Result.y conversions <- unique(conversions[c("From.x", "From.y", "Result")]) colnames(conversions) <- c("From", "To", "Result") coefficients <- data.frame() for(i in levels(as.factor(fromunit))) { # Look through each different "From" unit in the data. coefficient <- 1 outto <- "" for(j in strsplit(i, split = " ")[[1]]) { # Look though each part of a composite unit. if(gsub("^/", "", j) != j) { # If unit is in denominator, use inverse. j <- gsub("^/", "", j) exponent <- -1 slash <- "/" } else { exponent <- 1 slash <- "" } conversions.j <- merge(conversions, j, by.x = "From", by.y = "y") conversions.j <- conversions.j[conversions.j$To %in% tounit, ] if(nrow(conversions.j) > 0) { coefficient <- coefficient * conversions.j$Result^exponent outto <- paste(outto, " ", slash, conversions.j$To, sep = "") } } coefficients <- rbind(coefficients, data.frame( From = i, To = gsub("^ ", "", outto), Result = coefficient )) } # Combine coefficients with data. out <- merge(fromunit, coefficients, by.x = "x", by.y = "From", sort = FALSE) out <- data.frame(Unit = out$To, Result = x * out$Result) } return(out) } temp <- setGeneric("convert.units") temp <- setMethod( f = "convert.units", signature = signature(x = "ovariable"), definition = function(x, tounit) { if("Unit" %in% colnames(x@output) & !is.null(tounit)) { x@output[c("Unit", "Result")] <- convert.units(x = x@output$Result, tounit = tounit, fromunit = x@output$Unit, expo = expo) } return(x) } ) temp <- setMethod( f = "convert.units", signature = signature(x = "data.frame"), definition = function(x, tounit = NULL) { if("Unit" %in% colnames(x) & "Result" %in% colnames(x) & !is.null(tounit)) { x[c("Unit", "Result")] <- convert.units(x = x$Result, tounit = tounit, fromunit = x$Unit, expo = expo) } return(x) } ) |