2012-05-20 2 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

Все, что менее «хакерское» должно будет анализировать ваши входы и сопоставлять их с несколькими заранее определенными шаблонами. Я пришел с этим:

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) 
Смежные вопросы