【问题标题】:Convert numbers to roman numerals in sapply in R在R中的sapply中将数字转换为罗马数字
【发布时间】:2019-02-26 09:18:04
【问题描述】:

正如Convert roman numerals to numbers in R 帖子中提到的,有一个从数字转换为罗马数字的功能。但是,当尝试在 sapply 过滤非数字符号中进行转换时

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")

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

【问题讨论】:

    标签: r type-conversion sapply


    【解决方案1】:

    嗨,

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

        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" 
    

    默认情况下,sapply 中输出的缩短似乎会将 roman 类转换回其数值。因此,首先将所有输出转换为 char 可以防止这种情况。

    试试:

    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"   
    

    还给出了recodet表格。

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

    > as.roman("3")
    [1] III
    > as.character(as.roman("3"))
    [1] "III"
    > c(as.roman("3"), "test")
    [1] "3"    "test"
    > c(as.character(as.roman("3")), "test")
    [1] "III"  "test"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 2012-10-27
      • 2019-01-09
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多