2012-05-20 4 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)