2017-09-02 73 views

回答

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

您可以为您的任务使用正则表达式。

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

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.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.tablepat来自(1)。

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