在R中将数字转换为罗马数字

问题描述 投票:0回答:1

正如后面的qazxsw poi中提到的,有一个从数字转换为罗马数字的功能。但是,在尝试进行非数字符号的过滤时进行转换

Convert roman numerals to numbers in R

数字保持不变。虽然它以元素方式完美运行。是函数as.roman还是符号表示(例如编码)表现错误?

r type-conversion sapply
1个回答
1
投票

NONHOLD,

我想你必须像这样添加一个as.character:

sequence.to_roman<-c(1,2,"V1","df",3)
sapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")

看起来像sapply中输出的缩短会默认将类roman转换回其数值。所以首先将所有输出转换为char可以防止这种情

尝试:

    sapply(sequence.to_roman, function(x) as.character(if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
> sapply(sequence.to_roman, function(x) as.character(if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
             1              2             V1             df              3 
           "I"           "II" "Some symbols" "Some symbols"          "III" 

这是我们想要的,但是:

lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")
> lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols")
[[1]]
[1] I

[[2]]
[1] II

[[3]]
[1] "Some symbols"

[[4]]
[1] "Some symbols"

[[5]]
[1] III

还给出了重新编码表格。

对于可能更明显的描述导致问题的原因:

unlist(lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
> unlist(lapply(sequence.to_roman, function(x) if(grepl("^[1-9]\\d*$",x)) as.roman(x) else "Some symbols"))
[1] "1"            "2"            "Some symbols" "Some symbols" "3"   
© www.soinside.com 2019 - 2024. All rights reserved.