24

R ではas.roman、非常に基本的なセットアップに優れた機能があります。

as.roman(79)
# [1] LXXIX

ローマ数字を数字に変換する逆関数はありますか?

(私は自分でそれを書くことができることを知っていますが、すでに準備されているか、できれば標準関数を使用することを好みます。残念ながら、それを見つけることができません。標準ライブラリまたはパッケージ関数が推奨されるソリューションです)

4

3 に答える 3

40

as.roman()クラスromanのオブジェクトを返すので、R はそれをそのように認識します。で直接アラビア数字に戻すことができますas.numeric()。有効なローマ数字になるような基準を満たす文字列がある場合は、 を使用してそれをクラス roman オブジェクトにas.roman()強制し、次に強制関数を構成してアラビア数字に強制することができます。検討:

> 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
于 2014-01-14T15:07:55.203 に答える
11

コードからas.roman見つけることができ.roman2numeric、実行するとそのコードが表示されますgetAnywhere(".roman2numeric")

コードは次のとおりです。

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
}

.roman2numeric@rawr がコメントで提案した方法で、ローマ数字にアクセスして 10 進数に変換できます。

> utils:::.roman2numeric("III")
[1] 3
> utils:::.roman2numeric("XII")
[1] 12
> utils:::.roman2numeric("LXXIX")
[1] 79
于 2014-01-14T15:12:37.710 に答える
6

ドキュメントromanによると、Rの数字は次のとおりです。

"roman"内部で整数として表され、出力、フォーマット、サブセット化、および への強制に適したメソッドを持つクラスのオブジェクトcharacter

したがって、次を使用して整数値を取得できるはずですas.integer()

as.integer(as.roman(79)+as.roman(12))
于 2014-01-14T15:08:26.677 に答える