【发布时间】:2016-05-15 14:49:20
【问题描述】:
我有一堆字母,我这辈子都不知道如何将它们转换成等值的数字。
letters[1:4]
有没有功能
numbers['e']
返回
5
或用户定义的东西(即 1994 年)?
我想将所有 26 个字母转换为特定值。
【问题讨论】:
标签: r
我有一堆字母,我这辈子都不知道如何将它们转换成等值的数字。
letters[1:4]
有没有功能
numbers['e']
返回
5
或用户定义的东西(即 1994 年)?
我想将所有 26 个字母转换为特定值。
【问题讨论】:
标签: r
我不知道“预建”功能,但是使用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),我更喜欢这个解决方案,因为它是矢量化的(我可以获得字符矢量的字母索引)。
你可以试试这个功能:
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}
【讨论】:
which 函数在这里似乎很合适。
which(letters == 'e')
#[1] 5
【讨论】:
which(letters == c('g', 'l', 'q', 'v', 'a'))
which(letters %in% c('g', 'l', 'q', 'v', 'a'))
创建一个查找向量并使用简单的子集:
x <- letters[1:4]
lookup <- setNames(seq_along(letters), letters)
lookup[x]
#a b c d
#1 2 3 4
如果要删除名称,请使用 unname。
【讨论】:
感谢所有的想法,但我是个笨蛋。
这就是我所做的。将每个字母映射到特定数字,然后调用每个字母
df=data.frame(L=letters[1:26],N=rnorm(26))
df[df$L=='e',2]
【讨论】: