こんにちは,shun(@datasciencemore)です!
前回まででtidyverseの8個のコアパッケージのうち,4個(tibble,dplyr,tidyr,ggplot2)が終了しました.
残り4個です,ついに折り返し地点まで来ました!
ここまででもかなりの前処理力がついたはずですが,もうちょい頑張りましょう.
今回は残りの4つのコアパッケージのうちの1つ,{stringr}をやっていきます.
{stringr}は文字列処理に特化したパッケージです.
今回も盛りだくさんですが,ひとつひとつ丁寧にやっていきましょう!
目次
0.{stringr}ってなに??
文字列には色々な処理が考えられるんだ.
例えば,文字列を連結してファイル名にしたり,文字列にマッチするところを探したり,などなど..
この文字列のいろんな処理の総称を文字列処理って呼んでるよ.
文字列処理は実に様々なパターンが考えられます.
全部やってると年が暮れてしまうので,ここでは大雑把に実務でよく使用することに絞って,紹介していきます.
(それでもすごく多そうだけど...笑)
この文字列処理に適したパッケージが{stringr}です.
1.長さ取得 str_length
str_lengthで文字列の長さを取得できます.
1 2 |
# 長さ取得 str_length(c("a", "the", "apple")) |
1 |
[1] 1 3 5 |
2.連結 str_c
str_cで複数の文字列を連結します.
1 2 |
# 連結 str_c("nogi", "sakura", "hinata") |
1 |
[1] "nogisakurahinata" |
引数sepを使うと,区切り文字を指定できます.
1 2 |
# 連結 _で繋げる. str_c("nogi", "sakura", "hinata", sep = "_") |
1 |
[1] "nogi_sakura_hinata" |
文字列ベクトル同士をつなぐこともできます.
1 2 3 4 5 |
# 連結 2つのベクトルの同じインデックスの要素を繋げる. vec_1 = c("nogi", "sakura", "hinata") vec_2 = c("mai", "ponpon", "sarina") str_c(vec_1, vec_2, sep = "-") |
1 |
[1] "nogi-mai" "sakura-ponpon" "hinata-sarina" |
引数collapseを使うと,ベクトルを1つの文字列にまとめてくれます.
1 2 3 |
# 連結 1つのベクトルの各要素を繋げて,1つの文字列にする. vec_1 = c("nogi", "sakura", "hinata") str_c(vec_1, collapse = "...") |
1 |
[1] "nogi...sakura...hinata" |
3.抽出 str_sub
str_subで,文字列の一部を抽出できます.
引数startとendで抽出する文字列の始点と終点を設定します.
1 2 |
# 抽出 2文字目から5文字目まで str_sub("qwertyuiop@", start = 2, end = 5) |
1 |
[1] "wert" |
引数startとendは,-でも指定することができます.
1 2 |
# 抽出 後ろ8文字目から後ろ5文字目まで str_sub("qwertyuiop@", start = -8, end = -5) |
1 |
[1] "rtyu" |
4.マッチの真偽 str_detect
str_detectで,指定したパターンにマッチした文字列があるかどうかを論理値(TRUEかFALSE)で判定します.
引数patternにパターン(正規表現OK)を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_group = c("nogi", "sakura", "hinata") # マッチの真偽 aが入っているか str_detect(vec_group, pattern = "a") |
1 |
[1] FALSE TRUE TRUE |
5.マッチ文字列の抽出 str_subset
str_subsetで,指定したパターンにマッチした文字列を抽出します.
引数patternにパターン(正規表現OK)を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_group = c("nogi", "sakura", "hinata") # マッチ文字列の抽出 aが入っている文字列を抽出 str_subset(vec_group, pattern = "a") |
1 |
[1] "sakura" "hinata" |
6.マッチの先頭抽出 str_extract
str_extractで,指定したパターンにマッチした部分のうち,先頭のものを抽出します.
引数patternにパターン(正規表現OK)を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_group = c("nogi", "sakura", "hinata") # マッチの先頭抽出 aにマッチした先頭部分を抽出 str_extract(vec_group, pattern = "a") |
7.マッチの全抽出 str_extract_all
str_extract_allで,指定したパターンにマッチした全部分を抽出します.
引数patternにパターン(正規表現OK)を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_group = c("nogi", "sakura", "hinata") # マッチの全抽出 aにマッチした全部分を抽出 str_extract_all(vec_group, pattern = "a") |
1 2 3 4 5 6 7 8 |
[[1]] character(0) [[2]] [1] "a" "a" [[3]] [1] "a" "a" |
引数simplifyをTRUEにすると行列形式で出力します.
デフォルトは,simplify=FALSEでリストで出力されます.
1 2 |
# マッチの全抽出 aにマッチした全部分を行列形式で抽出 str_extract_all(vec_group, pattern = "a", simplify = TRUE) |
1 2 3 4 |
[,1] [,2] [1,] "" "" [2,] "a" "a" [3,] "a" "a" |
ややこしいよね,これも...
次の図で理解できるかな?
str_subsetは,まず文字列がマッチしているかを判定して,マッチがある文字列のみを抽出します.この例の場合,nogiはマッチがないので,抽出されず,マッチがあるsakura,hinataが抽出されます.
str_extractは,マッチ部分のうち,先頭のマッチ部分のみを抽出します.この例の場合だと黄色の部分ですね.
str_extractは,マッチ部分のすべてを抽出します.この例の場合だと,黄色とピンク色の部分です.
NAとcharacter(0)の違いは,あまり気にしなくていいです.
両方とも値がないんだという理解で十分です.
8.マッチの先頭置換 str_replace
str_replaceで,指定したパターンにマッチした部分のうち,先頭のものを指定文字列に置換します.
引数patternにパターン(正規表現OK)を,引数replacementに置換したい文字列を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # マッチの先頭置換 aにマッチした先頭部分を-で置換 str_replace(vec_name, pattern = "a", replacement = "-") |
1 |
[1] "-suka" "mizuki" "min-mi" |
9.マッチの全置換 str_replace_all
str_replace_allで,指定したパターンにマッチした全部分を置換します.
引数patternにパターン(正規表現OK)を,引数replacementに置換したい文字列を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # マッチの全置換 aにマッチした全部分を-で置換 str_replace_all(vec_name, pattern = "a", replacement = "-") |
1 |
[1] "-suk-" "mizuki" "min-mi" |
str_replace_allは,名前付きベクトルを指定することで,複数の置き換えができます.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # マッチの全置換 aをAに,mをMに置換 str_replace_all(vec_name, c("a" = "A", "m" = "M")) |
1 |
[1] "AsukA" "Mizuki" "MinAMi" |
次のコードでも上と全く同じです.
名前付きベクトルを外set_replace_allの外で作成しているだけです.
1 2 3 4 5 6 7 8 9 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # 名前付きベクトルを外で作成 vec_replace = c("A", "M") names(vec_replace) = c("a", "m") # マッチの全置換 aをAに,mをMに置換 str_replace_all(vec_name, vec_replace) |
1 |
[1] "AsukA" "Mizuki" "MinAMi" |
10.マッチの分割 str_split
str_splitで,指定したパターンにマッチした部分で文字列を分割できます.
引数patternにパターン(正規表現OK)を指定します.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # マッチの分割 uにマッチした部分で分割 str_split(vec_name, pattern = "u") |
1 2 3 4 5 6 7 8 |
[[1]] [1] "as" "ka" [[2]] [1] "miz" "ki" [[3]] [1] "minami" |
引数simplifyをTRUEにすると行列形式で出力します.
デフォルトは,simplify=FALSEでリストで出力されます.
1 2 3 4 5 |
# 文字列のベクトルを定義 vec_name = c("asuka", "mizuki", "minami") # マッチの分割 uにマッチした部分で分割(行列形式で出力) str_split(vec_name, pattern = "u", simplify = TRUE) |
1 2 3 4 |
[,1] [,2] [1,] "as" "ka" [2,] "miz" "ki" [3,] "minami" "" |
11.その他
上で紹介した関数以外にもまだまだたくさんあります!
- str_trim:空白の除去
- str_dup:繰り返し
- str_locate:マッチの先頭部分のインデックスの取得
- str_locate_all:マッチの全部分のインデックスの取得
- str_to_lower:小文字の変換
- str_to_upper:大文字への変換
- str_pad:指定文字でパティング
- str_conv:エンコーディング
- str_count:マッチ部分の個数取得
などなど...
数えればきりがないので,やめておきます笑
まとめ
文字列処理について以下のことをやってきました.
- 長さ取得 str_length
- 連結 str_c
- 抽出 str_sub
- マッチの真偽 str_detect
- マッチ文字列の抽出 str_subset
- マッチの先頭抽出 str_extract
- マッチの全抽出 str_extract_all
- マッチの先頭置換 str_replace
- マッチの全置換 str_replace_all
- マッチの分割 str_split
- その他
多いですね...
こんなの普通の人間には到底覚えられません.
ちなみに僕もここに書いてあることの3割くらいしか覚えていません笑
けど,そんなもんでいいんです,なんとなく,「あー,そういえばこんな関数あったなぁ」くらい覚えていればすぐにググれますしね.
何回も繰り返して徐々に覚えていきましょう.
それじゃ,お疲れ様でした!!