Rで文字列操作を行う場合、baseRでもstringrでもどちらでも行える内容はほぼ同じです。ただし、stringrの方が、名前の統一感がありますし、tidyverseパッケージに含まれており、パイプ演算子(%>%)との相性も抜群ですので、今後、stringrを使っていくのが望ましいと思います。このページでは、stringrに対応するbaseRの文字列操作関数を示しつつ、stringrの使い方をまとめています。
Rの主な文字列操作関数
Rの主な文字列操作関数は以下の通りです。このサイトでは、stringrの使い方をまとめていますが、参考のため、stringRとbaseRの対応表も載せておきます。
機能 | stringr | baseR |
比較・検索(一致、含む/含まない?) | str_subset(x, pattern) | grep(pattern, x, value = TRUE) |
str_which(x, pattern) | grep(pattern, x) | |
str_detect(x, pattern) | grepl(pattern, x) | |
str_locate(x, pattern) | regexpr(pattern, x) | |
str_locate_all(x, pattern)) | gregexpr(pattern, x) | |
抽出 (抜き出し、切り出し) |
str_extract(x, pattern) | regexpr(pattern, x) + regmatches(x) |
str_extract_all(x, pattern) | ||
str_sub(x, start, end) | substr(x, start, end) | |
置換(変換、置き換え) | str_replace(x, pattern, replacement) | sub(pattern, replacement, x) |
str_replace_all(x, pattern, replacement) | ||
結合(連結) | str_c(…, sep = “”, collapse = NULL) | paste(…, sep = ” “, collapse = NULL) paste0(…, collapse = NULL) |
分割 | str_split(x, pattern) | strsplit(x, pattern) |
その他 | ||
先頭、末尾の空白除去 | str_trim(x) | trimws(x) |
文字列の長さ | str_length(x) | nchar(x) |
文字列の繰り返し | str_dup(x, n) | strrep(x, n) |
大文字化、小文字化 | str_to_upper(x), str_to_lower(x) |
toupper(x) tolower(x) |
文字埋め込み | str_pad(x, w,idth, side, pad) | (sprintf等) |
stringrの特徴
- stringrパッケージはHadley Wickham作成であり、tidyverseに含まれています。
- このためパイプ演算子(%>%)の処理もしやすいです。
- baseRよりも処理が速いです。
- 関数名が全てstr_で始まっており覚えやすいです。
- 主な文字列処理はこれでOKです。
スクレイピング
文字列操作ができるようになるとスクレイピングも簡単にできるようになります。スクレイピングの実施例はこちら
stringrの主な文字列操作関数の使い方・具体例
比較・検索(一致、含む/含まない?)
条件にマッチする文字を検索する関数として、以下の関数があります。関数によって、検索結果の戻り値として、何を返してくるかが異なります。
関数 | 戻り値 |
str_subset(x, pattern) | 指定パターンを含む要素の文字列を返す。 |
str_which(x, pattern) | 指定パターンを含む要素の要素番号を返す。 |
str_detect(x, pattern) | 各要素が指定パターンを含んでいるかどうかを論理ベクトルで返す。 |
str_locate(x, pattern) | 指定パターンにマッチする箇所のうち、最初の部分について、パターンの開始位置と終了位置を返す。 |
str_locate_all(x, pattern)) | 指定パターンにマッチする箇所の全箇所について、パターンの開始位置と終了位置を返す。 |
文字列ベクトルxから、パターンpatternを検索する。patternは、文字、文字列、正規表現。
str_subsetの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_subset(fruits, pattern = "a") # aを検索
[1] "apple" "banana" "pear" "pineapple" "grape"
> str_subset(fruits, pattern = "p") # pを検索
[1] "apple" "pear" "pineapple" "grape"
> str_subset(fruits, pattern = "g") # gを検索
[1] "grape"
> str_subset(fruits, pattern = "ap") # apを検索
[1] "apple" "pineapple" "grape"
> str_subset(fruits, pattern = "an") # anを検索
[1] "banana"
> str_subset(fruits, pattern = "p.*e") # 正規表現で検索
[1] "apple" "pear" "pineapple" "grape"
>
str_whichの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
>
> str_which(fruits, pattern = "a") # aを検索
[1] 1 2 3 4 5
> str_which(fruits, pattern = "p") # pを検索
[1] 1 3 4 5
> str_which(fruits, pattern = "g") # gを検索
[1] 5
> str_which(fruits, pattern = "ap") # apを検索
[1] 1 4 5
> str_which(fruits, pattern = "an") # anを検索
[1] 2
> str_which(fruits, pattern = "p.*e") # 正規表現で検索
[1] 1 3 4 5
str_detectの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_detect(fruits, pattern = "a") # aを検索
[1] TRUE TRUE TRUE TRUE TRUE
> str_detect(fruits, pattern = "p") # pを検索
[1] TRUE FALSE TRUE TRUE TRUE
> str_detect(fruits, pattern = "g") # gを検索
[1] FALSE FALSE FALSE FALSE TRUE
> str_detect(fruits, pattern = "ap") # apを検索
[1] TRUE FALSE FALSE TRUE TRUE
> str_detect(fruits, pattern = "an") # anを検索
[1] FALSE TRUE FALSE FALSE FALSE
> str_detect(fruits, pattern = "p.*e") # 正規表現で検索
[1] TRUE FALSE TRUE TRUE TRUE
str_locateの使用例
str_locate_allとは異なり、パターンにマッチする最初の部分について、文字の開始位置と終了位置をintベクトル(dim = (xの要素数, 2))を返します。
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_locate(fruits, pattern = "a") # aを検索
start end
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 5 5
[5,] 3 3
> str_locate(fruits, pattern = "p") # pを検索
start end
[1,] 2 2
[2,] NA NA
[3,] 1 1
[4,] 1 1
[5,] 4 4
> str_locate(fruits, pattern = "g") # gを検索
start end
[1,] NA NA
[2,] NA NA
[3,] NA NA
[4,] NA NA
[5,] 1 1
> str_locate(fruits, pattern = "ap") # apを検索
start end
[1,] 1 2
[2,] NA NA
[3,] NA NA
[4,] 5 6
[5,] 3 4
> str_locate(fruits, pattern = "an") # anを検索
start end
[1,] NA NA
[2,] 2 3
[3,] NA NA
[4,] NA NA
[5,] NA NA
> str_locate(fruits, pattern = "p.*e") # 正規表現で検索
start end
[1,] 2 5
[2,] NA NA
[3,] 1 2
[4,] 1 9
[5,] 4 5
str_locate_allの使用例
str_locateとは異なり、パターンにマッチするすべての箇所について、文字の開始位置と終了位置をlistで返します。
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_locate_all(fruits, pattern = "a") # aを検索
[[1]]
start end
[1,] 1 1
[[2]]
start end
[1,] 2 2
[2,] 4 4
[3,] 6 6
[[3]]
start end
[1,] 3 3
[[4]]
start end
[1,] 5 5
[[5]]
start end
[1,] 3 3
> str_locate_all(fruits, pattern = "p") # pを検索
[[1]]
start end
[1,] 2 2
[2,] 3 3
[[2]]
start end
[[3]]
start end
[1,] 1 1
[[4]]
start end
[1,] 1 1
[2,] 6 6
[3,] 7 7
[[5]]
start end
[1,] 4 4
> str_locate_all(fruits, pattern = "g") # gを検索
[[1]]
start end
[[2]]
start end
[[3]]
start end
[[4]]
start end
[[5]]
start end
[1,] 1 1
> str_locate_all(fruits, pattern = "ap") # apを検索
[[1]]
start end
[1,] 1 2
[[2]]
start end
[[3]]
start end
[[4]]
start end
[1,] 5 6
[[5]]
start end
[1,] 3 4
> str_locate_all(fruits, pattern = "an") # anを検索
[[1]]
start end
[[2]]
start end
[1,] 2 3
[2,] 4 5
[[3]]
start end
[[4]]
start end
[[5]]
start end
> str_locate_all(fruits, pattern = "p.*e") # 正規表現で検索
[[1]]
start end
[1,] 2 5
[[2]]
start end
[[3]]
start end
[1,] 1 2
[[4]]
start end
[1,] 1 9
[[5]]
start end
[1,] 4 5
抽出(切り出し、抜き出し)
str_extract、str_subは文字列を抽出(切り出し、抜き出し)しますが、条件の指定方法が異なります。
関数 | 戻り値 |
str_extract(x, pattern) | 条件にマッチする文字列を抽出 |
str_extract_all(x, pattern) | 条件にマッチする文字列を全て抽出 |
str_sub(x, start, end) | startとendで示される位置の文字列を抽出 |
文字列ベクトルxから、パターンpatternを検索する。patternは、文字、文字列、正規表現。start, endは何番目かの位置を示す番号。
str_extractの使用例
マッチする最初の文字列を抽出。戻り値は文字列ベクトル。
> fruits <- c("4 apples", "10 bananas", "pear", "pineapple", "grape")
>
> str_extract(fruits, "ap") # apを抽出
[1] "ap" NA NA "ap" "ap"
> str_extract(fruits, "p.*e") # 正規表現(p.*e = pからeの部分)を抽出
[1] "pple" NA "pe" "pineapple" "pe"
> str_extract(fruits, "\\d+") # 正規表現(\\d = 数字が連続が連続している部分)を抽出
[1] "4" "10" NA NA NA あ
str_extract_allの使用例
マッチするすべての文字列を抽出。戻り値はlist。
> fruits <- c("4 apples", "10 bananas", "pear", "pineapple", "grape")
> str_extract_all(fruits, "p") # pを検索
[[1]]
[1] "p" "p"
[[2]]
character(0)
[[3]]
[1] "p"
[[4]]
[1] "p" "p" "p"
[[5]]
[1] "p"
> str_extract_all(fruits, "na") # naを検索
[[1]]
character(0)
[[2]]
[1] "na" "na"
[[3]]
character(0)
[[4]]
character(0)
[[5]]
character(0)
> str_extract_all(fruits, "\\w") # 正規表現(\\w = 単語文字)を検索
[[1]]
[1] "4" "a" "p" "p" "l" "e" "s"
[[2]]
[1] "1" "0" "b" "a" "n" "a" "n" "a" "s"
[[3]]
[1] "p" "e" "a" "r"
[[4]]
[1] "p" "i" "n" "e" "a" "p" "p" "l" "e"
[[5]]
[1] "g" "r" "a" "p" "e"
str_subの使用例
> fruits <- c("4 apples", "10 bananas", "pear", "pineapple", "grape")
> str_sub(fruits, start = 1, end = 5) # 1文字目から5文字目
[1] "4 app" "10 ba" "pear" "pinea" "grape"
> str_sub(fruits, start = 5) # 5文字目以降
[1] "ples" "ananas" "" "apple" "e"
> str_sub(fruits, end = 3) # 3文字目まで
[1] "4 a" "10 " "pea" "pin" "gra"
置換(変換、置き換え)
文字列xに対し、パターンpattern部分を文字列replacementに置換した文字列を返します。
関数 | 戻り値 |
str_replace(x, pattern, replacement) | patternに一致する最初の文字列を置換する。 |
str_replace_all(x, pattern, replacement) | patternに一致するすべての文字列を置換する。 |
str_replaceの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_replace(fruits, "[aeiou]", "-")
[1] "-pple" "b-nana" "p-ar" "p-neapple" "gr-pe"
# a,e,i,o,uに一致する最初の部分を-(ハイフン)に置換
str_replace_allの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_replace_all(fruits, "[aeiou]", "-")
[1] "-ppl-" "b-n-n-" "p--r" "p-n--ppl-" "gr-p-"
# a,e,i,o,uの全てを-(ハイフン)に置換
結合(連結)
関数 | 戻り値 |
str_c(…, sep = “”, collapse = NULL) | 複数の文字ベクトル(…)を間にsepで指定した文字列をを挟みながら要素ごとに連結する。collapseがNULLでないときは、連結された文字ベクトルを間にcollapseでしていした文字列を挟みながら、一つの文字ベクトルに連結する。 |
collapse = NULLの場合、戻り値は合成したベクトルの要素数と同じ。collapseがNULLでない場合は、要素数1の文字列ベクトル。
str_cの使用例
> fruits1 <- c("apple", "banana", "pear")
> fruits2 <- c("pineapple", "grape", "kiwi")
> str_c(fruits1, fruits2)
[1] "applepineapple" "bananagrape" "pearkiwi" #要素ごとに連結
> str_c(fruits1, fruits2, sep = "-")
[1] "apple-pineapple" "banana-grape" "pear-kiwi"
> str_c(fruits1, fruits2, collapse = "") # collapse指定で各要素も連結
[1] "applepineapplebananagrapepearkiwi"
> str_c(fruits1, fruits2, sep = "-", collapse = "&")
[1] "apple-pineapple&banana-grape&pear-kiwi"
分割
関数 | 戻り値 |
str_split(x, pattern) | 文字列ベクトルxをpatternにマッチした部分で分割した結果をlistで返す |
戻り値は要素数がxの要素数に等しいlist型
str_splitの使用例
> fruits <- c(
+ "apple and banana and pear",
+ "pineapple and grape and kiwi"
+ )
> str_split(fruits, " and ") #" and "を区切り位置として各文字列を分割
[[1]]
[1] "apple" "banana" "pear"
[[2]]
[1] "pineapple" "grape" "kiwi"
その他
その他、比較的よく使われる関数として以下のようなものもあります。
関数 | 戻り値 |
str_trim(x) | 先頭、末尾の空白除去した文字列を返す |
str_length(x) | 文字列の長さを返す |
str_dup(x, n) | 文字列xをn回繰り返した文字列を返す |
str_to_upper(x), str_to_lower(x) | 大文字化、小文字化した文字列を返す |
str_pad(x, width, side = c(“left”, “right”, “both”, pad), pad = ” “) |
文字列xを幅widthで位置をsideにして、残りをpadで埋めた文字列を返す |
str_trimの使用例
> str_trim(" String with trailing and leading white space\t")
[1] "String with trailing and leading white space"
str_lengthの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_length(fruits)
[1] 5 6 4 9 5
str_dupの使用例
> str_dup("apple", 4)
[1] "appleappleappleapple"
> rep("apple", 4)
[1] "apple" "apple" "apple" "apple" # rep()関数だと、4つのベクトルになる
str_to_upperの使用例
> fruits <- c("apple", "banana", "pear", "pineapple", "grape")
> str_to_upper(fruits)
[1] "APPLE" "BANANA" "PEAR" "PINEAPPLE" "GRAPE"
str_to_lowerの使用例
> fruits <- c("APPLE", "BANANA", "PEAR", "PINEAPPLE", "GRAPE")
> str_to_lower(fruits)
[1] "apple" "banana" "pear" "pineapple" "grape"
str_padの使用例
> str_pad("hadley", 30, "left") # width = 30 , side = "left"の場合
[1] " hadley"
> str_pad("hadley", 30, "right") # width = 30 , side = "left"の場合
[1] "hadley "
> str_pad("hadley", 30, "both") # width = 30 , side = "both"の場合
[1] " hadley "
> str_pad("hadley", 30, "left", pad = "_") # padを指定した場合
[1] "________________________hadley"
> str_pad("hadley", 30, "both", pad = "_") # padも指定した場合
[1] "____________hadley____________"
正規表現
文字列操作関数のマッチングには正規表現を使用することができます。正規表現が使えるようになると、検索、置換等の文字列操作の自由度が格段に増えます。正規表現の詳細については、こちらをご覧ください。
まとめ
stringrを使ったRの文字列操作関数についてまとめました。baseRでできる文字列操作は、基本的にstringrでもできますし、stringrの方が名前も覚えやすいと思います。stringrはtidyverseに含まれるパッケージですし、今後、ますます使用されることが多くなると思います。ぜひ、stringrを使えるようになってください。