字符串是s =' [12] B1 [16] M5'
我希望在R中使用 strsplit 函数将其拆分为以下结果:
let <- c('[12]B', '[16]M')
num <- c(1, 5)
非常感谢
答案 0 :(得分:2)
您可以为您的任务使用正则表达式。
s = '[12]B1[16]M22'
grx <- gregexpr("\\[.+?\\].+[[:digit:]]?", s)
let <- do.call(c, regmatches(s, grx))
#let
#[1] "[12]B" "[16]M"
如果你想得到所有的块(让+ num),你可以调整下面的模式。这有助于提取数字部分。
grx <- gregexpr("\\[.+?\\].+([[:digit:]]+)", s)
out <- do.call(c, regmatches(s, grx))
num <- gsub(".+\\][[:alpha:]]+", "", out)
num
[1] "1" "22"
答案 1 :(得分:1)
使用stringr
包:
library(stringr)
x <- '[12]B1[16]M2'
let <- unlist(str_extract_all(x, "\\[[0-9]{2}\\][A-Z]"))
x <- gsub(pattern = "\\[[0-9]{2}\\][A-Z]",
replacement = "",
x)
num <- unlist(str_extract_all(x, "[0-9]"))
正则表达式"\\[[0-9]{2}\\][A-Z]"
可以细分为
\\[
一个开头括号[0-9]{2}
两个连续数字的序列\\]
结束括号[A-Z]
一个恰好一个大写字母的序列答案 2 :(得分:1)
1)strapply 创建一个与两部分匹配的正则表达式pat
,然后使用strapply
分别提取每个部分。第一个捕获组(正则表达式的第一个带括号的部分)由左方括号"\\["
组成,最小的字符串为".*?"
,直到右方括号"\\]"
后跟任何字符"."
。第二个捕获组由一个或多个数字"\\d+"
组成。
library(gsubfn)
pat <- "(\\[.*?\\].)(\\d+)"
let <- strapply(s, pat, simplify = c)
num <- strapply(s, pat, ~ as.numeric(..2), simplify = c)
let
## [1] "[12]B" "[16]M"
num
## [1] 1 5
1a)变异
这也可以表示为mapply
生成2分量列表:
mapply(strapply, s, pat, c(~ ..1, ~ as.numeric(..2)), simplify = "c",
SIMPLIFY = FALSE, USE.NAMES = FALSE)
## [[1]]
## [1] "[12]B" "[16]M"
##
## [[2]]
## [1] 1 5
2)gsub / read.table 这不使用任何软件包 - 仅gsub
和read.table
。 pat
在(1)中定义。它返回一个数据框,结果为两个coiumns:
read.table(text = gsub(pat, "\\1 \\2\n", s), as.is = TRUE, col.names = c("let", "num"))
## let num
## 1 [12]B 1
## 2 [16]M 5
3)gsub / strsplit 这有点类似于(2)但使用strsplit
而不是read.table
。 pat
来自(1)。
spl <- matrix(strsplit(gsub(pat, "\\1 \\2 ", s), " ")[[1]], 2)
let <- spl[1, ]
num <- as.numeric(spl[2, ])