大量(10.000未満)をローマンに変換したい。私はas.roman関数を知っています。しかし、それは3899にしか行きません。大規模な数値をローマンに変換する方法R
この関数のソースコードを変更して、大きな数値を変換することは可能ですか?または新しい関数を書くことは可能ですか?
私はR 3.3.0を実行しています。
ベスト、 サンダー。
大量(10.000未満)をローマンに変換したい。私はas.roman関数を知っています。しかし、それは3899にしか行きません。大規模な数値をローマンに変換する方法R
この関数のソースコードを変更して、大きな数値を変換することは可能ですか?または新しい関数を書くことは可能ですか?
私はR 3.3.0を実行しています。
ベスト、 サンダー。
私はPerlで整数からローマ字への変換関数を書いていましたが、私はちょうどこの答えのためにRでそれを書き換えた。私がnewfangled strrep()
関数を使用していることに注意してください。この関数は3.3.0で追加されたものだと思います。
integerToRoman <- function(x) {
x <- as.integer(x);
neg <- x<0L;
x <- abs(x);
cnt <- integer(length(x));
res <- rep('',length(x));
if (any(m <- x==0L)) { res[m] <- 'nulla'; };
if (any(m <- x>=1000L)) { cnt[m] <- x[m]%/%1000L; x[m] <- x[m]%%1000L; res[m] <- strrep('M',cnt[m]); };
if (any(m <- x>=900L)) { res[m] <- paste0(res[m],'CM'); x[m] <- x[m]-900L; };
if (any(m <- x>=500L)) { res[m] <- paste0(res[m],'D'); x[m] <- x[m]-500L; };
if (any(m <- x>=400L)) { res[m] <- paste0(res[m],'CD'); x[m] <- x[m]-400L; };
if (any(m <- x>=100L)) { cnt[m] <- x[m]%/%100L; x[m] <- x[m]%%100L; res[m] <- paste0(res[m],strrep('C',cnt[m])); };
if (any(m <- x>=90L)) { res[m] <- paste0(res[m],'XC'); x[m] <- x[m]-90L; };
if (any(m <- x>=50L)) { res[m] <- paste0(res[m],'L'); x[m] <- x[m]-50L; };
if (any(m <- x>=40L)) { res[m] <- paste0(res[m],'XL'); x[m] <- x[m]-40L; };
if (any(m <- x>=10L)) { cnt[m] <- x[m]%/%10L; x[m] <- x[m]%%10L; res[m] <- paste0(res[m],strrep('X',cnt[m])); };
if (any(m <- x>=9L)) { res[m] <- paste0(res[m],'IX'); x[m] <- x[m]-9L; };
if (any(m <- x>=5L)) { res[m] <- paste0(res[m],'V'); x[m] <- x[m]-5L; };
if (any(m <- x>=4L)) { res[m] <- paste0(res[m],'IV'); x[m] <- x[m]-4L; };
if (any(m <- x>=1L)) res[m] <- paste0(res[m],strrep('I',x[m]));
if (any(neg)) res[neg] <- paste0('-',res[neg]);
res;
}; ## end integerToRoman()
デモ:
set.seed(319072L); data.frame(int=x <- sample(seq(0L,5e3L),20L),roman=integerToRoman(x));
## int roman
## 1 614 DCXIV
## 2 4825 MMMMDCCCXXV
## 3 6 VI
## 4 4721 MMMMDCCXXI
## 5 9 IX
## 6 3333 MMMCCCXXXIII
## 7 2114 MMCXIV
## 8 4861 MMMMDCCCLXI
## 9 1042 MXLII
## 10 3609 MMMDCIX
## 11 417 CDXVII
## 12 241 CCXLI
## 13 3 III
## 14 4952 MMMMCMLII
## 15 1370 MCCCLXX
## 16 1789 MDCCLXXXIX
## 17 3730 MMMDCCXXX
## 18 2275 MMCCLXXV
## 19 1139 MCXXXIX
## 20 4898 MMMMDCCCXCVIII
あなたのコードをperlからRに変換するための努力をいただきありがとうございます。 –
その理由は何ですか。 roman2numeric関数は3899を超えています。 –
3899は*標準*ローマ数字で書ける最大の数字です - 数字の上または下の数字を表す棒を使用して開発されたメソッドもあります(https://en.wikipedia.orgを参照)。/wiki/Roman_numerals#Large_numbers。しかし、これらのどれも単純な文字列として表現することはできません – dww
それは事です:私はローマンで "4000"と書くことはできませんか? –