将字母转换为数字

时间:2016-05-15 14:49:21

标签: r

我有一堆字母,并且不能为我的生活弄清楚如何将它们转换为相当于它们的数字。

letters[1:4]

是否有功能

numbers['e']

返回

5

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

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

5 个答案:

答案 0 :(得分:21)

我不知道"预制"函数,但使用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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:9)

您可以尝试此功能:

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

这是一个简短的测试:

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

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

代码有效,因为表示字母的utf8代码的数字序列遵循字母顺序。

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

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

答案 3 :(得分:6)

此处which功能似乎合适。

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

答案 4 :(得分:0)

感谢所有的想法,但我是一个dumdum。

这就是我的所作所为。制作从每个字母到特定数字的映射,然后调用每个字母

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