numeros - Convertir números romanos a números en R
traductor de numeros romanos del 1 al 10000 (3)
Desde el código as.roman
puede encontrar .roman2numeric
y se puede ver su código si ejecuta getAnywhere(".roman2numeric")
El código es:
function (x)
{
romans <- c("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
"IX", "V", "IV", "I")
numbers <- c(1000L, 900L, 500L, 400L, 100L, 90L, 50L, 40L,
10L, 9L, 5L, 4L, 1L)
out <- integer(length(x))
ind <- is.na(x)
out[ind] <- NA
if (any(!ind)) {
y <- toupper(x[!ind])
y <- gsub("CM", "DCCCC", y)
y <- gsub("CD", "CCCC", y)
y <- gsub("XC", "LXXXX", y)
y <- gsub("XL", "XXXX", y)
y <- gsub("IX", "VIIII", y)
y <- gsub("IV", "IIII", y)
ok <- grepl("^M{,3}D?C{,4}L?X{,4}V?I{,4}$", y)
if (any(!ok)) {
warning(sprintf(ngettext(sum(!ok), "invalid roman numeral: %s",
"invalid roman numerals: %s"), paste(x[!ind][!ok],
collapse = " ")), domain = NA)
out[!ind][!ok] <- NA
}
if (any(ok))
out[!ind][ok] <- sapply(strsplit(y[ok], ""), function(z) as.integer(sum(numbers[match(z,
romans)])))
}
out
}
Puede acceder a .roman2numeric
y convertir números romanos a números decimales de la forma que @rawr sugiere en su comentario.
> utils:::.roman2numeric("III")
[1] 3
> utils:::.roman2numeric("XII")
[1] 12
> utils:::.roman2numeric("LXXIX")
[1] 79
En R, hay una gran función as.roman
en la configuración muy básica:
as.roman(79)
# [1] LXXIX
¿Hay una función inversa que convertiría números romanos a números?
(Sé que puedo escribirlo yo mismo, pero prefiero usar funciones ya preparadas o preferiblemente estándar, por desgracia no puedo encontrar una. La función de biblioteca estándar o paquete es una solución preferida)
Los números roman
en R son, según los documentos :
objetos de la clase
"roman"
que se representan internamente como números enteros, y tienen métodos adecuados para imprimir, formatear, subordenar y aplicarcharacter
.
Por lo tanto, debería poder recuperar el valor entero usando as.integer()
:
as.integer(as.roman(79)+as.roman(12))
as.roman()
devuelve un objeto de clase roman , por lo que R lo reconoce como tal. Puede volver a convertirlo directamente en un número árabe con as.numeric()
. Si tiene una cadena que cumple con los criterios para que pueda ser un número romano válido, puede forzarlo a un objeto de clase romana con as.roman()
, y luego convertirlo en un número árabe componiendo las funciones de coerción. Considerar:
> as.roman(79)
[1] LXXIX
> x <- as.roman(79)
> x
[1] LXXIX
> str(x)
Class ''roman'' int 79
> as.roman("LXXIX")
[1] LXXIX
> as.numeric(as.roman("LXXIX"))
[1] 79