2012-05-20 41 views
4

我试图编写一个R函数将分数和混合数字转换为小数。例如将混合数字,分数和整数的字符向量转换为数字

mixedToFloat <- function(x){ 
    x <- sub(' ', '+', x, fixed=TRUE) 
    return(unlist(lapply(x, function(x) eval(parse(text=x))))) 
} 

> mixedToFloat(c('1 1/2', '2 3/4', '2/3', '11 1/4', '1')) 
[1] 1.5000000 2.7500000 0.6666667 11.2500000 1.0000000 

这适用于大多数我能想到的情况,但感觉有点冒失。有没有更标准的方法来做到这一点?

回答

1

任何少于“hackish”的都将不得不解析您的输入,并将它们与许多预定义的模式匹配。我想出了这个:

mixedToFloat <- function(x){ 
    is.integer <- grepl("^\\d+$", x) 
    is.fraction <- grepl("^\\d+\\/\\d+$", x) 
    is.mixed <- grepl("^\\d+ \\d+\\/\\d+$", x) 
    stopifnot(all(is.integer | is.fraction | is.mixed)) 

    numbers <- strsplit(x, "[ /]") 

    ifelse(is.integer, as.numeric(sapply(numbers, `[`, 1)), 
    ifelse(is.fraction, as.numeric(sapply(numbers, `[`, 1))/
         as.numeric(sapply(numbers, `[`, 2)), 
         as.numeric(sapply(numbers, `[`, 1)) + 
         as.numeric(sapply(numbers, `[`, 2))/
         as.numeric(sapply(numbers, `[`, 3)))) 
} 

mixedToFloat(c('1 1/2', '2 3/4', '2/3', '11 1/4', '1')) 
# [1] 1.5000000 2.7500000 0.6666667 11.2500000 1.0000000 
1

这使用strapplyc提取号码,然后calc把他们的标准形式,将它们转换为数字并执行计算:

library(gsubfn) 

ff <- c('1 1/2', '2 3/4', '2/3', '11 1/4', '1') 
calc <- function(s) { 
    x <- c(if (length(s) == 2) 0, as.numeric(s), 0:1) 
    x[1] + x[2]/x[3] 
} 
sapply(strapplyc(ff, "\\d+"), calc) 
相关问题