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", "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;", "111-111-1111",
              "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;", "&#32113;&#35336;")
########

#&#25991;&#23383;&#21015;&#12434;&#12497;&#12479;&#12540;&#12531;&#12391;&#35469;&#35672;:str_detect&#12467;&#12510;&#12531;&#12489;
#&#25991;&#23383;&#21015;:string&#12458;&#12503;&#12471;&#12519;&#12531;
#&#35469;&#35672;&#12377;&#12427;&#12497;&#12479;&#12540;&#12531;:pattern&#12458;&#12503;&#12471;&#12519;&#12531;
#&#21442;&#32771;:&#28450;&#23383;:"\\p{Han}",&#12402;&#12425;&#12364;&#12394;:"\\p{Hiragana}",&#12459;&#12479;&#12459;&#12490;:"\\p{Katakana}"
#&#12459;&#12479;&#12459;&#12490;&#12414;&#12383;&#12399;&#28450;&#23383;&#12434;&#21547;&#12416;&#25991;&#23383;&#21015;&#12434;&#26908;&#26619;
str_detect(string = TestData, pattern = "\\p{Katakana}|\\p{Han}")
[1] FALSE  TRUE FALSE FALSE  TRUE

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#25991;&#23383;&#21015;&#12434;&#25277;&#20986;:str_subset&#12467;&#12510;&#12531;&#12489;
#&#12459;&#12479;&#12459;&#12490;&#12414;&#12383;&#12399;&#28450;&#23383;&#12434;&#21547;&#12416;&#25991;&#23383;&#21015;&#12434;&#26908;&#26619;
str_subset(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}")
[1] "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;" "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;" "&#32113;&#35336;"

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#25991;&#23383;&#21015;&#12398;&#21021;&#12417;&#12398;&#25991;&#23383;&#12434;&#25277;&#20986;:str_extract&#12467;&#12510;&#12531;&#12489;
str_extract(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}")
[1] NA "&#12356;" NA "&#12363;" "&#32113;"

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#25991;&#23383;&#21015;&#12398;&#20840;&#25991;&#23383;&#12434;&#25277;&#20986;:str_extract_all&#12467;&#12510;&#12531;&#12489;
#matrix&#12391;&#34920;&#31034;:simplify&#12458;&#12503;&#12471;&#12519;&#12531;;&#21021;&#26399;&#20516;FALSE
str_extract_all(string = TestData, pattern = "\\p{Hiragana}|\\p{Han}", simplify = TRUE)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] ""   ""   ""   ""   ""   ""   ""   ""
[2,] "&#12356;" "&#12356;" "&#12418;" "&#12398;" ""   ""   ""   ""
[3,] ""   ""   ""   ""   ""   ""   ""   ""
[4,] "&#12363;" "&#12425;" "&#12384;" "&#12395;" "&#12356;" "&#12356;" "&#12418;" "&#12398;"
[5,] "&#32113;" "&#35336;" ""   ""   ""   ""   ""   ""

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#21021;&#12417;&#12398;&#25991;&#23383;&#20301;&#32622;:str_locate&#12467;&#12510;&#12531;&#12489;
str_locate(string = TestData, pattern = "&#12356;&#12356;|&#35336;")
&#12288;&#12288;&#12288;start end
[1,]    NA  NA
[2,]     6   7
[3,]    NA  NA
[4,]    11  12
[5,]     2   2

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#25991;&#23383;&#21015;&#12398;&#20840;&#25991;&#23383;&#20301;&#32622;:str_locate_all&#12467;&#12510;&#12531;&#12489;
str_locate_all(string = TestData, pattern = "&#12356;|&#35336;")
[[1]]
start end
[[2]]
&#12288;&#12288;&#12288;start end
[1,]     6   6
[2,]     7   7
[[3]]
start end
[[4]]
&#12288;&#12288;&#12288;start end
[1,]    11  11
[2,]    12  12
[[5]]
&#12288;&#12288;&#12288;start end
[1,]     2   2

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#21021;&#12417;&#12398;&#25991;&#23383;&#12434;&#32622;&#25563;:str_replace&#12467;&#12510;&#12531;&#12489;
#&#32622;&#25563;&#20869;&#23481;:replacement&#12458;&#12503;&#12471;&#12519;&#12531;
str_replace(string = TestData,  pattern = "[&#12363;&#12356;]", replacement = "*")
[1] "Karada-Good"&#12288;"&#12459;&#12521;&#12480;&#12491;&#12289;*&#12356;&#12418;&#12398;"&#12288;"111-111-1111"
[4] "Name:*&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;" "&#32113;&#35336;"

#&#12497;&#12479;&#12540;&#12531;&#12395;&#35442;&#24403;&#12377;&#12427;&#25991;&#23383;&#21015;&#12398;&#20840;&#25991;&#23383;&#12434;&#32622;&#25563;:str_replace_all&#12467;&#12510;&#12531;&#12489;
str_replace_all(string = TestData,  pattern = "[&#12363;&#12356;]", replacement = "*")
[1] "Karada-Good"&#12288;"&#12459;&#12521;&#12480;&#12491;&#12289;**&#12418;&#12398;"&#12288;"111-111-1111"
[4] "Name:*&#12425;&#12384;&#12395;&#12289;**&#12418;&#12398;" "&#32113;&#35336;"

#&#25991;&#23383;&#21015;&#12398;&#32080;&#21512;:str_c&#12467;&#12510;&#12531;&#12489;
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"

#&#12456;&#12531;&#12467;&#12540;&#12489;&#12398;&#22793;&#25563;:str_conv&#12467;&#12510;&#12531;&#12489;
#iconv&#12467;&#12510;&#12531;&#12489;&#12424;&#12426;&#12418;&#20351;&#12356;&#21213;&#25163;&#12364;&#33391;&#12356;&#12391;&#12377;
#UTF-8&#12363;&#12425;&#22793;&#25563;,&#33521;&#25968;&#23383;&#20197;&#22806;&#12399;&#25991;&#23383;&#21270;&#12369;
str_conv(string = TestData, encoding = "ISO-8859-1")
[1] "Karada-Good"
[2] "\u0083J\u0083\u0089\u0083_\u0083j\u0081A\u0082&cent;\u0082&cent;\u0082&agrave;\u0082&Igrave;"
[3] "111-111-1111"
[4] "Name:\u0082&copy;\u0082&ccedil;\u0082&frac34;\u0082&Eacute;\u0081A\u0082&cent;\u0082&cent;\u0082&agrave;\u0082&Igrave;"
[5] "\u0093\u009d\u008cv"

#&#25991;&#23383;&#21015;&#12395;&#12497;&#12479;&#12540;&#12531;&#12364;&#12356;&#12367;&#12388;&#21547;&#12414;&#12428;&#12427;&#12363;:str_count&#12467;&#12510;&#12531;&#12489;
str_count(TestData, pattern = "1")
[1]  0  0 10  0  0

#&#25991;&#23383;&#21015;&#12434;&#32368;&#12426;&#36820;&#12377;:str_dup&#12467;&#12510;&#12531;&#12489;
str_dup(string = TestData, 2)
[1] "Karada-GoodKarada-Good" "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;"
[3] "111-111-1111111-111-1111" "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;"
[5] "&#32113;&#35336;&#32113;&#35336;"
#&#12371;&#12398;&#12424;&#12358;&#12394;&#20351;&#12356;&#26041;&#12418;
str_c("&#12363;&#12425;&#12384;&#12395;", str_dup("&#12356;&#12356;&#12418;&#12398;", 2))
[1] "&#12363;&#12425;&#12384;&#12395;&#12356;&#12356;&#12418;&#12398;&#12356;&#12356;&#12418;&#12398;"

#&#25991;&#23383;&#21015;&#12398;&#38263;&#12373;&#12434;&#21462;&#24471;:str_length&#12467;&#12510;&#12531;&#12489;
str_length(string = TestData)
[1] 11  9 12 14  2

#&#25351;&#23450;&#12375;&#12383;&#20869;&#23481;&#12434;&#25407;&#20837;&#12375;&#25991;&#23383;&#21015;&#12398;&#38263;&#12373;&#12434;&#35519;&#25972;:str_pad&#12467;&#12510;&#12531;&#12489;
#&#26085;&#26412;&#35486;&#12399;1&#25991;&#23383;wirth=2&#25201;&#12356;&#12391;&#12377;
#&#38263;&#12373;&#12434;&#25351;&#23450;:width&#12458;&#12503;&#12471;&#12519;&#12531;
#&#26041;&#21521;:side&#12458;&#12503;&#12471;&#12519;&#12531;;"left","right","both"
#&#20869;&#23481;:pad&#12458;&#12503;&#12471;&#12519;&#12531;
str_pad(string = TestData, width = 19, side = "both", pad = "?")
[1] "????Karada-Good????"     "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;?"
[3] "???111-111-1111????"     "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;"
[5] "???????&#32113;&#35336;????????"

#&#25991;&#23383;&#21015;&#21069;&#24460;&#12398;&#31354;&#30333;&#12434;&#21066;&#38500;:str_trim&#12467;&#12510;&#12531;&#12489;
#&#26041;&#21521;:side&#12458;&#12503;&#12471;&#12519;&#12531;;"left","right","both"
str_trim(string = "   Karada-Good  ", side = "right")
[1] "   Karada-Good"

#&#25351;&#23450;&#20301;&#32622;&#12395;&#25913;&#34892;&#12467;&#12540;&#12489;&#25407;&#20837;,&#20808;&#38957;&#12392;&#25913;&#34892;&#24460;&#12395;&#31354;&#30333;&#25407;&#20837;:str_wrap&#12467;&#12510;&#12531;&#12489;
#&#25913;&#34892;&#12467;&#12540;&#12489;&#25407;&#20837;&#20301;&#32622;:width&#12458;&#12503;&#12471;&#12519;&#12531;
#&#20808;&#38957;&#12398;&#31354;&#30333;&#25968;:indent&#12458;&#12503;&#12471;&#12519;&#12531;
#&#25913;&#34892;&#24460;&#12398;&#31354;&#30333;&#25968;:exdent&#12458;&#12503;&#12471;&#12519;&#12531;
str_wrap(string = "Karada-Good", width = 8,
         indent = 1, exdent = 1)

#&#12497;&#12479;&#12540;&#12531;&#20869;&#23481;&#12391;&#25991;&#23383;&#21015;&#12434;&#20998;&#21106;:str_split&#12467;&#12510;&#12531;&#12489;
#&#20998;&#21106;&#25968;:n&#12458;&#12503;&#12471;&#12519;&#12531;;&#21021;&#26399;&#20516;Inf
str_split(string = TestData, pattern = "-", n = Inf)
[[1]]
[1] "Karada" "Good"
[[2]]
[1] "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;"
[[3]]
[1] "111"  "111"  "1111"
[[4]]
[1] "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;"
[[5]]
[1] "&#32113;&#35336;"

#&#25351;&#23450;&#31684;&#22258;&#12391;&#25991;&#23383;&#21015;&#12434;&#25277;&#20986;:str_sub&#12467;&#12510;&#12531;&#12489;
#&#38283;&#22987;&#28857;:start&#12458;&#12503;&#12471;&#12519;&#12531;
#&#32066;&#20102;&#28857;:edd&#12458;&#12503;&#12471;&#12519;&#12531;
str_sub(string = TestData, start = 3, end = -2)
[1] "rada-Goo" "&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;" "1-111-111"
[4] "me:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;" ""

#&#12497;&#12479;&#12540;&#12531;&#20869;&#23481;&#12434;&#21547;&#12416;&#25991;&#23383;&#21015;&#12434;&#25277;&#20986;:str_subset&#12467;&#12510;&#12531;&#12489;
str_subset(string = TestData, pattern = "[&#12356;1]")
[1] "&#12459;&#12521;&#12480;&#12491;&#12289;&#12356;&#12356;&#12418;&#12398;"      "111-111-1111"
[3] "Name:&#12363;&#12425;&#12384;&#12395;&#12289;&#12356;&#12356;&#12418;&#12398;"

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

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