我有一个独特的字符,每个字母后面都跟着一个数字。例如:A1B10C5
我想用R将其拆分为letter <- c(A, B, C)
和number <- c(1, 10, 5)
。
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"
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
包中使用。 - Sagarstr_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"
您还可以使用基本的R语言regmatches
和gregexpr
函数:
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]])
data.frame(L = v1[c(TRUE, FALSE)], N = as.numeric(v1[c(FALSE, TRUE)]))
。 - Frankstrsplit(str1, "[0-9]+") %>% unlist()
这样的东西会起作用。 - acylamstrsplit
来处理数字。但现在我看看@akrun只使用正则表达式一次,并使用逻辑索引分别提取字母和数字。 - acylam