Rで解析:文字列操作の決定版!「stringr」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

英数字の1バイト文字は悩まずに操作できますが「ひらがなやカタカナ、漢字」などの全角文字2バイト文字は苦労が多いです。そんな苦労を解決するパッケージの紹介です。

本パッケージの管理者はggplot2でお馴染みのHadley氏です。なお、パターンに使用する正規表現のルールは検索していただくか、下記記事で御殿入りの「Rプログラミングマニュアル(第2版)―Rバージョン3対応」がオススメです。

Rjpwikiで拝見した間瀬 茂先生の「本書が最後の仕事」という内容のエントリを思い出します。第1版のハードカバーの時から手元に置いている最高の良書です。

おすすめ!勝手にランキング:Rで解析するなら、ぜひ持っていてほしい書籍

パッケージバージョンは1.4.0。実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("stringr")
#もしくは
install.packages("tidyverse")

実行コマンドの紹介

詳細はコマンド、パッケージのヘルプを確認してください。

#パッケージの読込
library("stringr")
#もしくは
library("tidyverse")

###データ例の作成#####
TestData <- c("Karada-Good", "カラダニ、いいもの", "111-111-1111",
              "Name:からだに、いいもの", "統計")
########

#文字列をパターンで認識:str_detectコマンド
#文字列:stringオプション
#認識するパターン:patternオプション
#参考:漢字:"\\p{Han}",ひらがな:"\\p{Hiragana}",カタカナ:"\\p{Katakana}"
#カタカナまたは漢字を含む文字列を検査
str_detect(string = TestData, pattern = "\\p{Katakana}|\\p{Han}")
[1] FALSE  TRUE FALSE FALSE  TRUE

#パターンに該当する文字列を抽出:str_subsetコマンド
#カタカナまたは漢字を含む文字列を検査
str_subset(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}")
[1] "カラダニ、いいもの" "Name:からだに、いいもの" "統計"

#パターンに該当す文字列の初めの文字を抽出:str_extractコマンド
str_extract(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}")
[1] NA "い" NA "か" "統"

#パターンに該当する文字列の全文字を抽出:str_extract_allコマンド
#matrixで表示:simplifyオプション;初期値FALSE
str_extract_all(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}", simplify = TRUE)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] ""   ""   ""   ""   ""   ""   ""   ""
[2,] "い" "い" "も" "の" ""   ""   ""   ""
[3,] ""   ""   ""   ""   ""   ""   ""   ""
[4,] "か" "ら" "だ" "に" "い" "い" "も" "の"
[5,] "統" "計" ""   ""   ""   ""   ""   ""

#パターンに該当する初めの文字位置:str_locateコマンド
str_locate(string = TestData, pattern = "いい|計")
   start end
[1,]    NA  NA
[2,]     6   7
[3,]    NA  NA
[4,]    11  12
[5,]     2   2

#パターンに該当する文字列の全文字位置:str_locate_allコマンド
str_locate_all(string = TestData, pattern = "い|計")
[[1]]
start end
[[2]]
   start end
[1,]     6   6
[2,]     7   7
[[3]]
start end
[[4]]
   start end
[1,]    11  11
[2,]    12  12
[[5]]
   start end
[1,]     2   2

#パターンに該当する初めの文字を置換:str_replaceコマンド
#置換内容:replacementオプション
str_replace(string = TestData,  pattern = "[かい]", replacement = "*")
[1] "Karada-Good" "カラダニ、*いもの" "111-111-1111"
[4] "Name:*らだに、いいもの" "統計"

#パターンに該当する文字列の全文字を置換:str_replace_allコマンド
str_replace_all(string = TestData,  pattern = "[かい]", replacement = "*")
[1] "Karada-Good" "カラダニ、**もの" "111-111-1111"
[4] "Name:*らだに、**もの" "統計"

#文字列の結合:str_cコマンド
str_c("Letter: ", letters)
[1] "Letter: a" "Letter: b" "Letter: c" "Letter: d" "Letter: e" "Letter: f" "Letter: g" "Letter: h"
[9] "Letter: i" "Letter: j" "Letter: k" "Letter: l" "Letter: m" "Letter: n" "Letter: o" "Letter: p"
[17] "Letter: q" "Letter: r" "Letter: s" "Letter: t" "Letter: u" "Letter: v" "Letter: w" "Letter: x"
[25] "Letter: y" "Letter: z"

#エンコードの変換:str_convコマンド
#iconvコマンドよりも使い勝手が良いです
#UTF-8から変換,英数字以外は文字化け
str_conv(string = TestData, encoding = "ISO-8859-1")
[1] "Karada-Good"
[2] "\u0083J\u0083\u0089\u0083_\u0083j\u0081A\u0082¢\u0082¢\u0082à\u0082Ì"
[3] "111-111-1111"
[4] "Name:\u0082©\u0082ç\u0082¾\u0082É\u0081A\u0082¢\u0082¢\u0082à\u0082Ì"
[5] "\u0093\u009d\u008cv"

#文字列にパターンがいくつ含まれるか:str_countコマンド
str_count(TestData, pattern = "1")
[1]  0  0 10  0  0

#文字列を繰り返す:str_dupコマンド
str_dup(string = TestData, 2)
[1] "Karada-GoodKarada-Good" "カラダニ、いいものカラダニ、いいもの"
[3] "111-111-1111111-111-1111" "Name:からだに、いいものName:からだに、いいもの"
[5] "統計統計"
#このような使い方も
str_c("からだに", str_dup("いいもの", 2))
[1] "からだにいいものいいもの"

#文字列の長さを取得:str_lengthコマンド
str_length(string = TestData)
[1] 11  9 12 14  2

#指定した内容を挿入し文字列の長さを調整:str_padコマンド
#日本語は1文字wirth=2扱いです
#長さを指定:widthオプション
#方向:sideオプション;"left","right","both"
#内容:padオプション
str_pad(string = TestData, width = 19, side = "both", pad = "?")
[1] "????Karada-Good????"     "カラダニ、いいもの?"
[3] "???111-111-1111????"     "Name:からだに、いいもの"
[5] "???????統計????????"

#文字列前後の空白を削除:str_trimコマンド
#方向:sideオプション;"left","right","both"
str_trim(string = "   Karada-Good  ", side = "right")
[1] "   Karada-Good"

#指定位置に改行コード挿入,先頭と改行後に空白挿入:str_wrapコマンド
#改行コード挿入位置:widthオプション
#先頭の空白数:indentオプション
#改行後の空白数:exdentオプション
str_wrap(string = "Karada-Good", width = 8,
         indent = 1, exdent = 1)

#パターン内容で文字列を分割:str_splitコマンド
#分割数:nオプション;初期値Inf
str_split(string = TestData, pattern = "-", n = Inf)
[[1]]
[1] "Karada" "Good"
[[2]]
[1] "カラダニ、いいもの"
[[3]]
[1] "111"  "111"  "1111"
[[4]]
[1] "Name:からだに、いいもの"
[[5]]
[1] "統計"

#指定範囲で文字列を抽出:str_subコマンド
#開始点:startオプション
#終了点:eddオプション
str_sub(string = TestData, start = 3, end = -2)
[1] "rada-Goo" "ダニ、いいも" "1-111-111"
[4] "me:からだに、いいも" ""

#パターン内容を含む文字列を抽出:str_subsetコマンド
str_subset(string = TestData, pattern = "[い1]")
[1] "カラダニ、いいもの"      "111-111-1111"
[3] "Name:からだに、いいもの"

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました