将字符拆分为字母和数字

8

我有一个独特的字符,每个字母后面都跟着一个数字。例如:A1B10C5

我想用R将其拆分为letter <- c(A, B, C)number <- c(1, 10, 5)

4个回答

9
我们可以使用正则表达式的lookaround功能来将字母和数字分开。
v1 <- strsplit(str1, "(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", perl = TRUE)[[1]]
v1[c(TRUE, FALSE)]
#[1] "A" "B" "C"

as.numeric(v1[c(FALSE, TRUE)])
#[1]  1 10  5

数据

str1 <- "A1B10C5"

2
我建议 OP 把它们以某种方式组合起来,例如 data.frame(L = v1[c(TRUE, FALSE)], N = as.numeric(v1[c(FALSE, TRUE)])) - Frank
你真的需要正向回顾吗?我认为像 strsplit(str1, "[0-9]+") %>% unlist() 这样的东西会起作用。 - acylam
@useR 在那种情况下数字去哪了?它们也是必需的。 - Frank
1
@useR 是的,你说得对,这也可以使用,然后再对字母进行第二次分割。 - akrun
1
@Frank,我只是在谈论他的第一行。你可以使用另一个strsplit来处理数字。但现在我看看@akrun只使用正则表达式一次,并使用逻辑索引分别提取字母和数字。 - acylam

6

str_extract_all是另一种实现此功能的方法:

library(stringr)

> str <- "A1B10C5"
> str
[1] "A1B10C5"

> str_extract_all(str, "[0-9]+")
[[1]]
[1] "1"  "10" "5" 

> str_extract_all(str, "[aA-zZ]+")
[[1]]
[1] "A" "B" "C"

str_replace_all 函数可在 stringr 包中使用。 - Sagar

3
为了同时提取字母和数字,您可以使用 str_match_all 函数来获取两个单独列中的字母和数字:
library(stringr)
str_match_all("A1B10C5", "([a-zA-Z]+)([0-9]+)")[[1]][,-1]

#     [,1] [,2]
#[1,] "A"  "1" 
#[2,] "B"  "10"
#[3,] "C"  "5" 

2

您还可以使用基本的R语言regmatchesgregexpr函数:

regmatches(this, gregexpr("[0-9]+",  "A1B10C5"))
[[1]]
[1] "1"  "10" "5" 

regmatches(this, gregexpr("[A-Z]+",  "A1B10C5"))
[[1]]
[1] "A" "B" "C"

这些函数返回一个只有一个元素的列表,即字符向量。像akrun一样,您可以使用[[1]]提取列表项,并且还可以将数字向量转换为数字,如下所示:

as.numeric(regmatches(this, gregexpr("[0-9]+", this))[[1]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接