DS講座 tidyverse tidyverse講座

【R前処理講座27】{stringr}:文字列処理【tidyverse】

こんにちは,shun(@datasciencemore)です!

前回まででtidyverseの8個のコアパッケージのうち,4個(tibble,dplyr,tidyr,ggplot2)が終了しました.
残り4個です,ついに折り返し地点まで来ました!
ここまででもかなりの前処理力がついたはずですが,もうちょい頑張りましょう.

今回は残りの4つのコアパッケージのうちの1つ,{stringr}をやっていきます.
{stringr}は文字列処理に特化したパッケージです.

今回も盛りだくさんですが,ひとつひとつ丁寧にやっていきましょう!

0.{stringr}ってなに??

{stringr}って何ですか??
{stringr}は,文字列処理に特化したパッケージのことだよ.

文字列には色々な処理が考えられるんだ.

例えば,文字列を連結してファイル名にしたり,文字列にマッチするところを探したり,などなど..

この文字列のいろんな処理の総称を文字列処理って呼んでるよ.

文字列処理は実に様々なパターンが考えられます.
全部やってると年が暮れてしまうので,ここでは大雑把に実務でよく使用することに絞って,紹介していきます.
(それでもすごく多そうだけど...笑)

この文字列処理に適したパッケージが{stringr}です.

1.長さ取得 str_length

str_lengthで文字列の長さを取得できます.

 

2.連結 str_c

str_cで複数の文字列を連結します.

引数sepを使うと,区切り文字を指定できます.

文字列ベクトル同士をつなぐこともできます.

引数collapseを使うと,ベクトルを1つの文字列にまとめてくれます.

 

3.抽出 str_sub

str_subで,文字列の一部を抽出できます.
引数startとendで抽出する文字列の始点と終点を設定します.

引数startとendは,-でも指定することができます.

 

4.マッチの真偽 str_detect

str_detectで,指定したパターンにマッチした文字列があるかどうかを論理値(TRUEかFALSE)で判定します.
引数patternにパターン(正規表現OK)を指定します.

 

5.マッチ文字列の抽出 str_subset

str_subsetで,指定したパターンにマッチした文字列を抽出します.
引数patternにパターン(正規表現OK)を指定します.

 

6.マッチの先頭抽出 str_extract

str_extractで,指定したパターンにマッチした部分のうち,先頭のものを抽出します.
引数patternにパターン(正規表現OK)を指定します.

 

7.マッチの全抽出 str_extract_all

str_extract_allで,指定したパターンにマッチした全部分を抽出します.
引数patternにパターン(正規表現OK)を指定します. 

引数simplifyをTRUEにすると行列形式で出力します.
デフォルトは,simplify=FALSEでリストで出力されます.

str_subset, str_extract, str_extract_allの違いがよくわかりません...

ややこしいよね,これも...

次の図で理解できるかな?

str_subsetは,まず文字列がマッチしているかを判定して,マッチがある文字列のみを抽出します.この例の場合,nogiはマッチがないので,抽出されず,マッチがあるsakura,hinataが抽出されます.
str_extractは,マッチ部分のうち,先頭のマッチ部分のみを抽出します.この例の場合だと黄色の部分ですね.
str_extractは,マッチ部分のすべてを抽出します.この例の場合だと,黄色とピンク色の部分です.

NAとcharacter(0)の違いは,あまり気にしなくていいです.

両方とも値がないんだという理解で十分です.

 

8.マッチの先頭置換 str_replace

str_replaceで,指定したパターンにマッチした部分のうち,先頭のものを指定文字列に置換します.
引数patternにパターン(正規表現OK)を,引数replacementに置換したい文字列を指定します.

 

9.マッチの全置換 str_replace_all

str_replace_allで,指定したパターンにマッチした全部分を置換します.
引数patternにパターン(正規表現OK)を,引数replacementに置換したい文字列を指定します.

str_replace_allは,名前付きベクトルを指定することで,複数の置き換えができます.

次のコードでも上と全く同じです.
名前付きベクトルを外set_replace_allの外で作成しているだけです.

 

10.マッチの分割 str_split

str_splitで,指定したパターンにマッチした部分で文字列を分割できます.
引数patternにパターン(正規表現OK)を指定します.

引数simplifyをTRUEにすると行列形式で出力します.
デフォルトは,simplify=FALSEでリストで出力されます.

 

11.その他

上で紹介した関数以外にもまだまだたくさんあります!

  • str_trim:空白の除去
  • str_dup:繰り返し
  • str_locate:マッチの先頭部分のインデックスの取得
  • str_locate_all:マッチの全部分のインデックスの取得
  • str_to_lower:小文字の変換
  • str_to_upper:大文字への変換
  • str_pad:指定文字でパティング
  • str_conv:エンコーディング
  • str_count:マッチ部分の個数取得

などなど...
数えればきりがないので,やめておきます笑

まとめ

文字列処理について以下のことをやってきました.

  1. 長さ取得 str_length
  2. 連結 str_c
  3. 抽出 str_sub
  4. マッチの真偽 str_detect
  5. マッチ文字列の抽出 str_subset
  6. マッチの先頭抽出 str_extract
  7. マッチの全抽出 str_extract_all
  8. マッチの先頭置換 str_replace
  9. マッチの全置換 str_replace_all
  10. マッチの分割 str_split
  11. その他

多いですね...
こんなの普通の人間には到底覚えられません.
ちなみに僕もここに書いてあることの3割くらいしか覚えていません笑
けど,そんなもんでいいんです,なんとなく,「あー,そういえばこんな関数あったなぁ」くらい覚えていればすぐにググれますしね.
何回も繰り返して徐々に覚えていきましょう.
それじゃ,お疲れ様でした!!

-DS講座, tidyverse, tidyverse講座