2012-05-20 72 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) 
相關問題