字母序列到数字序列 R

Sequence of letters to sequence of numbers R

我的数据框如下所示:

df <- as.data.frame(c("AAA", "AAB", "AAC", "BBA"))
df

1                           AAA
2                           AAB
3                           AAC
4                           BBA

我想获得类似的东西:

1                           111
2                           112
3                           113
4                           221

base R中,我们可以使用chartr

df[[1]] <- chartr("ABC", "123", df[[1]])
df[[1]]
#[1] "111" "112" "113" "221"

如果替换的值有多个字符,那么一般的解决方案是 str_replace_all - 使用命名的 key/value 向量来匹配和替换

library(stringr)
 str_replace_all(df[[1]],   setNames(c("1", "2", "3"), c("A", "B", "C")))
[1] "111" "112" "113" "221"

另一种选择是使用来自基数 R 的 LETTERS 和命名向量将字母转换为各自的数字。

libary(tidyverse) 

map_chr(strsplit(df$x, ""), ~ str_flatten(setNames(seq_along(LETTERS), LETTERS)[.]))
[1] "111" "112" "113" "221"

另一种选择是使用 gsubfn 将字母替换为数字:

library(gsubfn)
v <- setNames(seq_along(LETTERS), LETTERS)
transform(df, numbers = gsubfn("(.)", as.list(v), df[[1]]))

输出:

  c..AAA....AAB....AAC....BBA.. numbers
1                           AAA     111
2                           AAB     112
3                           AAC     113
4                           BBA     221

这是另一个使用 utf8ToInt

的基础 R 技巧
> v <- c("AAA", "AAB", "AAC", "BBA")

> sapply(v, function(x) crossprod(utf8ToInt(x) - 64, 10^((nchar(x):1) - 1)))
AAA AAB AAC BBA 
111 112 113 221