我有一个独特的角色,每个字母都跟一个数字。例如:A1B10C5
我想使用R。
将其拆分为letter <- c(A, B, C)
和number <- c(1, 10, 5)
答案 0 :(得分:8)
我们可以使用正则表达式的外观来区分字母和数字
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"
答案 1 :(得分: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"
答案 2 :(得分:2)
您还可以将基础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]])
答案 3 :(得分:1)
要同时提取字母和数字,您可以使用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"