【问题标题】:Convert letters to numbers将字母转换为数字
【发布时间】:2016-05-15 14:49:20
【问题描述】:

我有一堆字母,我这辈子都不知道如何将它们转换成等值的数字。

letters[1:4]

有没有功能

numbers['e']

返回

5

或用户定义的东西(即 1994 年)?

我想将所有 26 个字母转换为特定值。

【问题讨论】:

    标签: r


    【解决方案1】:

    我不知道“预建”功能,但是使用match 很容易设置这样的映射。对于您给出的具体示例,将字母与其在字母表中的位置匹配,我们可以使用以下代码:

    myLetters <- letters[1:26]
    
    match("a", myLetters)
    [1] 1
    

    将其他值与字母关联起来几乎同样容易。以下是使用随机选择整数的示例。

    # assign values for each letter, here a sample from 1 to 2000
    set.seed(1234)
    myValues <- sample(1:2000, size=26)
    names(myValues) <- myLetters
    
    myValues[match("a", names(myValues))]
    a 
    228
    

    另请注意,此方法也可以扩展到字母(字符串)的有序集合。

    【讨论】:

    • 比起which(x == letters),我更喜欢这个解决方案,因为它是矢量化的(我可以获得字符矢量的字母索引)。
    【解决方案2】:

    你可以试试这个功能:

    letter2number <- function(x) {utf8ToInt(x) - utf8ToInt("a") + 1L}
    

    这是一个简短的测试:

    letter2number("e")
    #[1] 5
    set.seed(123)
    myletters <- letters[sample(26,8)]
    #[1] "h" "t" "j" "u" "w" "a" "k" "q"
    unname(sapply(myletters, letter2number))
    #[1]  8 20 10 21 23  1 11 17
    

    该函数计算它所传递给的字母的 utf8 代码,从该值中减去字母“a”的 utf8 代码,并在该值上添加数字 1,以确保遵守 R 的索引约定,根据其中字母的编号从 1 开始,而不是从 0。

    该代码有效,因为表示字母的 utf8 代码的数字序列尊重字母顺序。


    相应地,您可以使用大写字母,

    LETTER2num <- function(x) {utf8ToInt(x) - utf8ToInt("A") + 1L}
    

    【讨论】:

    • 你能不能让它处理多个字母?
    【解决方案3】:

    which 函数在这里似乎很合适。

    which(letters == 'e')
    #[1] 5
    

    【讨论】:

    • 不适用于超过 2 个字母。试试which(letters == c('g', 'l', 'q', 'v', 'a'))
    • 对于不止一个,您应该使用which(letters %in% c('g', 'l', 'q', 'v', 'a'))
    【解决方案4】:

    创建一个查找向量并使用简单的子集:

    x <- letters[1:4]
    lookup <- setNames(seq_along(letters), letters)
    lookup[x]
    #a b c d 
    #1 2 3 4 
    

    如果要删除名称,请使用 unname

    【讨论】:

      【解决方案5】:

      感谢所有的想法,但我是个笨蛋。

      这就是我所做的。将每个字母映射到特定数字,然后调用每个字母

      df=data.frame(L=letters[1:26],N=rnorm(26))
      df[df$L=='e',2]
      

      【讨论】:

      • 也许会根据投票重新考虑您接受的答案?
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多