No era exactamente claro si realmente quería convertir dígitos en sus equivalentes alfa. Si es así, esta es una estrategia mucho más general. Hay (al menos) dos funciones de conversión de texto a numérico en los archivos de rhelp: digits2text
de Jim Lemon y numberstowords
de John Fox. También me cambié a gregexpr
para llegar a un enfoque vectorizado:
cortar y pegar Lemon's function from the HTML found here trabajado fuera de la caja:
> m <- gregexpr("[0-9]+", x)
> sym <- regmatches(x,m)
> regmatches(x,m) <- digits2text(as.numeric(sym[[1]]))
illion = 0
digilen = 3
digitext = three hundred forty six
[1] 6 4 3
>
> x
[1] "I like three hundred forty six ice cream cones. They're three hundred forty six percent good! I ate three hundred forty six."
que tenía que hacer algo de edición de los numberstowords porque había algunos saltos de línea que faltan y que en mal estado el análisis (e incluyo a continuación la versión exitosa esta demostración:
> m <- gregexpr("[0-9]+", x)
> sym <- regmatches(x,m)
> regmatches(x,m) <- numbers2words(as.numeric(sym[[1]]))
>
> x
[1] "I like three hundred forty six ice cream cones. They're three hundred forty six percent good! I ate three hundred forty six."
función de Fox editado desde: http://tolstoy.newcastle.edu.au/R/help/05/04/2715.html
numbers2words <- function(x){
helper <- function(x){
digits <- rev(strsplit(as.character(x), "")[[1]])
nDigits <- length(digits)
if (nDigits == 1) as.vector(ones[digits])
else if (nDigits == 2)
if (x <= 19) as.vector(teens[digits[1]])
else trim(paste(tens[digits[2]],
Recall(as.numeric(digits[1]))))
else if (nDigits == 3) trim(paste(ones[digits[3]], "hundred",
Recall(makeNumber(digits[2:1]))))
else {
nSuffix <- ((nDigits + 2) %/% 3) - 1
if (nSuffix > length(suffixes)) stop(paste(x, "is too large!"))
trim(paste(Recall(makeNumber(digits[
nDigits:(3*nSuffix + 1)])),
suffixes[nSuffix],
Recall(makeNumber(digits[(3*nSuffix):1]))))
}
}
trim <- function(text){
gsub("^\ ", "", gsub("\ *$", "", text))
}
makeNumber <- function(...) as.numeric(paste(..., collapse=""))
opts <- options(scipen=100)
on.exit(options(opts))
ones <- c("", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine")
names(ones) <- 0:9
teens <- c("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", " seventeen", "eighteen", "nineteen")
names(teens) <- 0:9
tens <- c("twenty", "thirty", "forty", "fifty", "sixty",
"seventy", "eighty", "ninety")
names(tens) <- 2:9
x <- round(x)
suffixes <- c("thousand", "million", "billion", "trillion")
if (length(x) > 1) return(sapply(x, helper))
helper(x)
}
Su 'hoja.de.datos dput''ed no evaluó a un hoja.de.datos. Acabo de editar tu publicación para que ahora lo haga. Espero que no te moleste :) –
Perdón por eso Josh. Gracias por ocuparte de eso y por tu respuesta. No sabía sobre el paquete gsubfn. Gracias por señalarlo. –