【发布时间】:2017-08-21 20:01:25
【问题描述】:
我有一个独特的字符,每个字母跟一个数字。例如:A1B10C5
我想使用 R 将其拆分为 letter <- c(A, B, C) 和 number <- c(1, 10, 5)。
【问题讨论】:
我有一个独特的字符,每个字母跟一个数字。例如: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"
【讨论】:
data.frame(L = v1[c(TRUE, FALSE)], N = as.numeric(v1[c(FALSE, TRUE)]))
strsplit(str1, "[0-9]+") %>% unlist() 这样的东西会起作用。
strsplit 作为数字。但现在我看着它。 @akrun 使用一次正则表达式并使用逻辑索引分别提取字母和数字
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 包中可用。
要同时提取字母和数字,您可以使用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"
【讨论】:
您还可以将基本 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]])
【讨论】: