京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【Rでの文字列処理シリーズ(その5)】文字列の抽出・切り出し・検出

はじめに

文字列処理・テキスト処理とは、プログラミングを行うなかで、文字列・テキストに対する色々な操作のことを指します。それら処理をうまく使いこなすことで、文字列を自由に処理できるようになります。文字列処理の活用事例は、キーワード抽出、テキスト分類、テキストマイニングの前処理など、多岐に渡ります。 今回の「Rでの文字列処理」シリーズで扱う、文字列処理のライブラリ・関数群やプログラムコードは、R環境上で無料で提供されている、オープン・ソフトウェアを用います。

この記事では、R言語での文字列の抽出/切り出しや検出について、いろいろと試してまとめてみました。主に、baseやstringrのパッケージを扱っています。

テキスト処理の関連記事

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

関連パッケージをロードする

library(stringr)
library(readr)

文字列の抽出/切り出しについて

stringr::str_extract関数、stringr::str_extract_all関数では、 文字列から一致するパターンを抽出して、ベクトルで結果を返す。

str_extractとstr_extract_allとで、少し挙動が違うみたいである。

以下に、テストデータでの実行例を示す。

#テストデータの読み込んで、unlistにする
Dat <- unlist(data.frame(readr::read_tsv(file="https://raw.githubusercontent.com/kumeS/Blog/master/TXT_proc/test.txt", 
                                         col_names=F, show_col_types = FALSE)),
              use.names = F)

#最初の部分を表示する
Dat
#[1] "abc ABC abc" "ABC abc ABC" "def DEF def" "DEF def DEF" "abc.ABC.abc"
#[6] "ABC.abc.ABC"

#abcが含まれる部分を要素ごとに抽出する
stringr::str_extract(string=Dat, pattern="abc")
#[1] "abc" "abc" NA    NA    "abc" "abc"

#abcが含まれる部分をすべて抽出する
stringr::str_extract_all(string=Dat, pattern="abc")
#[[1]]
#[1] "abc" "abc"
#
#[[2]]
#[1] "abc"
#
#[[3]]
#character(0)
#
#[[4]]
#character(0)
#
#[[5]]
#[1] "abc" "abc"
#
#[[6]]
#[1] "abc"

文字数指定で、文字列を抽出する

base::substrあるいはstringr::str_subを使って、 文字ベクトルの部分文字列を文字数指定で抽出する。

#任意の文字列
Moji <- "abcdefghij"

#文字数のカウント
nchar(Moji)
#[1] 10

#substr関数で、1から3文字目までを抽出する
base::substr(Moji, start=1, stop=3)
#[1] "abc"

#substr関数で、4から6文字目までを抽出する
base::substr(Moji, start=4, stop=6)
#[1] "def"

#次に、str_sub関数で、1から3文字目までを抽出する
stringr::str_sub(Moji, start=1, end=3)
#[1] "abc"

#str_sub関数で、4から6文字目までを抽出する
stringr::str_sub(Moji, start=4, end=6)
#[1] "def"

#str_sub関数で、1文字目から、後ろから3文字目までを抽出する
stringr::str_sub(Moji, start=1, end=-3)
#[1] "abcdefgh"

#str_sub関数で、4文字目から最後の文字までを抽出する
stringr::str_sub(Moji, start=4, end=-1)
#[1] "defghij"

stringr::str_sub関数では、 マイナス付きで、startあるいはendを指定すると、 後ろから何文字目かを指定できる。

文字列の検出

stringr::str_detect関数は、 文字列の中のパターンの有無を検出する。

#そのパターンが含まれるかどうかを、TRUE/FALSEで返す
stringr::str_detect(string=Dat, pattern="abc")
#[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE

#パターンが含まれた場合には、FALSEで返す (negate = TRUE)
stringr::str_detect(string=Dat, pattern="abc", negate = TRUE)
#[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

「月の英語表記」を「月の数字」に置換する方法について

#月の英語表記を月の数字に変換するTips
Month <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

#数字に変換
match(Month, month.abb)
#[1]  1  2  3  4  5  6  7  8  9 10 11 12

#数字に変換: 桁数を合わせる
formatC(match(Month, month.abb), width = 2, flag = "0")
#[1] "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12"

参考資料

https://www.it-swarm.jp.net/ja/r/%E3%83%94%E3%83%AA%E3%82%AA%E3%83%89%E3%81%A7strsplit%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1048748448/www.it-swarm.jp.net

stats.biopapyrus.jp

kazutan.github.io

github.com

www.rdocumentation.org

kazutan.github.io

stats.biopapyrus.jp

bioscryptome.t-ohashi.info

www.medi-08-data-06.work

kazutan.github.io

stats.biopapyrus.jp

heavywatal.github.io