我有一堆字母,并且不能为我的生活弄清楚如何将它们转换为相当于它们的数字。
letters[1:4]
是否有功能
numbers['e']
返回
5
或用户定义的东西(即1994年)?
我想将所有26个字母转换为特定值。
答案 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]