英数字の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:からだに、いいもの"
少しでも、あなたの解析が楽になりますように!!