如何在R中用括号和数字拆分字母?

时间:2017-09-02 14:40:13

标签: r strsplit

字符串是s =' [12] B1 [16] M5'

我希望在R中使用 strsplit 函数将其拆分为以下结果:

let <- c('[12]B', '[16]M')

num <- c(1, 5)

非常感谢

3 个答案:

答案 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 这不使用任何软件包 - 仅gsubread.tablepat在(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.tablepat来自(1)。

spl <- matrix(strsplit(gsub(pat, "\\1 \\2 ", s), " ")[[1]], 2)
let <- spl[1, ]
num <- as.numeric(spl[2, ])