traductor romanos números numeros normales naturales fechas españoles convertir arábigos arabigos r roman-numerals

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 aplicar character .

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