【发布时间】:2020-04-26 06:26:26
【问题描述】:
我正在尝试将字符串“abcd”转换为一串数字,其中每个数字将指示该特定字母在字母表中的位置,在这种情况下需要:“1234”。在 R 中是否有执行此操作的函数?
我试过了:
str2int <- function(x) {
match(x, letters[1:26])
}
str2int("abcd")
这不起作用,因为字符串中有多个字符
【问题讨论】:
我正在尝试将字符串“abcd”转换为一串数字,其中每个数字将指示该特定字母在字母表中的位置,在这种情况下需要:“1234”。在 R 中是否有执行此操作的函数?
我试过了:
str2int <- function(x) {
match(x, letters[1:26])
}
str2int("abcd")
这不起作用,因为字符串中有多个字符
【问题讨论】:
如果它实际上是一个没有空格等应该保留的字符串并且只是一系列小写字母,您可以使用charToRaw,然后转换为数字并减去96。
您需要减去 96 的原因是因为 as.numeric(chartoRaw(x)) 给出了字符在 ascii table 上的位置,并且 a-z 从该表上的位置 97 开始。
test <- paste(letters, collapse = '')
test
# [1] "abcdefghijklmnopqrstuvwxyz"
library(magrittr)
test %>%
charToRaw %>%
as.numeric %>%
'-'(96) %>%
paste(collapse = '')
# [1] "1234567891011121314151617181920212223242526"
编辑:@akrun 在下面提出了一个更好的方法。您可以将charToRaw %>% as.numeric 替换为utf8toInt。
【讨论】:
'-'(96)吗?
我们可以在函数内部使用strsplit
str2int <- function(x) {
x1 <- strsplit(x, "")[[1]]
paste(match(x1, letters), collapse="")
}
str2int("abcd")
#[1] "1234"
或者另一个选项是gsubfn
library(gsubfn)
gsubfn(".", ~ match(x, letters), "abcd")
#[1] "1234"
【讨论】:
另一个选项是chartr
TestString = "abcd"
chartr(paste(letters[1:10], collapse=''),
paste(c(1:9,0), collapse=''), TestString)
【讨论】: