字符串为s = '[12] B1 [16] M5'如何在R中用括号和数字拆分字母?
我想将它拆分与strsplit函数以下结果在R:
let <- c('[12]B', '[16]M')
num <- c(1, 5)
非常感谢
字符串为s = '[12] B1 [16] M5'如何在R中用括号和数字拆分字母?
我想将它拆分与strsplit函数以下结果在R:
let <- c('[12]B', '[16]M')
num <- c(1, 5)
非常感谢
使用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]
的确切的序列的序列一个大写字母您可以为您的任务使用正则表达式。
s = '[12]B1[16]M22'
grx <- gregexpr("\\[.+?\\].+[[:digit:]]?", s)
let <- do.call(c, regmatches(s, grx))
#let
#[1] "[12]B" "[16]M"
如果你想获得所有块(let + num),你可以按如下方式调整模式。这有助于提取数字部分。
grx <- gregexpr("\\[.+?\\].+([[:digit:]]+)", s)
out <- do.call(c, regmatches(s, grx))
num <- gsub(".+\\][[:alpha:]]+", "", out)
num
[1] "1" "22"
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
。 (1)中定义了pat
。它返回的结果的数据帧以两种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, ])