字母序列到数字序列 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
我的数据框如下所示:
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
> 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