Вопрос по r – Преобразовать вектор символов из смешанных чисел, дробей и целых чисел в числовые

5

Я пытаюсь написать функцию 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

Это работает для большинства случаев, о которых я могу думать, но кажется немного хакерским. Есть ли более стандартный способ сделать это?

Ваш Ответ

2   ответа
2

Что-нибудь менее "хакерское" придется проанализировать ваши входные данные и сопоставить их с рядом предопределенных шаблонов. Я придумал это:

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
2

Это использует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)

Похожие вопросы