2017-09-02 3 views

答えて

1

stringrパッケージを使用して:

正規表現 "\\[[0-9]{2}\\][A-Z]"

  • \\[開口ブラケットとして分解することができる
    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]正確の配列の配列1つの大文字
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)を取得したい場合は、以下のようにパターンを調整できます。これにより、数値部分の抽出が容易になります。

1
grx <- gregexpr("\\[.+?\\].+([[:digit:]]+)", s) 
out <- do.call(c, regmatches(s, grx)) 

num <- gsub(".+\\][[:alpha:]]+", "", out) 

num 
[1] "1" "22" 

1)strapplystrapplyを使用して個別に抽出し、次いで二つの部分に一致する正規表現、patを作成します。最初のキャプチャグループ(正規表現の最初のカッコで囲まれた部分)は、左角括弧"\\["からなり、最も小さい文字列は".*?"右角括弧"\\]"に続き、任意の文字は"."です。第2の捕捉グループは、1つ以上の数字"\\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)で定義されています。

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使用:これは、2つのcoiumnsに結果とデータフレームを返します。 patは(1)からのものです。

spl <- matrix(strsplit(gsub(pat, "\\1 \\2 ", s), " ")[[1]], 2) 
let <- spl[1, ] 
num <- as.numeric(spl[2, ]) 
関連する問題