文字列がS =である '[12] B1 [16] M5'Rの括弧と数字を含む文字を分割する方法は?
IがRでstrsplit機能と次の結果として、それを分割したい:
let <- c('[12]B', '[16]M')
num <- c(1, 5)
ありがとうございました
文字列がS =である '[12] B1 [16] M5'Rの括弧と数字を含む文字を分割する方法は?
IがRでstrsplit機能と次の結果として、それを分割したい:
let <- c('[12]B', '[16]M')
num <- c(1, 5)
ありがとうございました
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つの大文字あなたのタスクには正規表現を使用できます。
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)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, ])