Topic 31
文字列処理の実務:stringr で検出・置換・抽出する
Practical string handling in R with stringr
CSV や Excel を読み込んだあと、商品名・自由記述・ID・単位付き数値の列を少し整えるだけで分析しやすくなることがよくあります。そんなときの最短ルートが <span class="inline-code">stringr</span> です。
講義資料では、stringr を使って文字列の長さ、部分抽出、大文字・小文字変換、検出、置換、分割、抽出、削除、数値部分の取り出しを一気に体験できるように整理していました。
このページでは、「どの関数をどの場面で使うか」が迷いにくいように、検出・置換・抽出・分割・数値化の5つに分けて紹介します。
このページのゴール
- stringr の基本関数を場面ごとに使い分けられる
- 単位付きの文字列から数値部分を取り出せる
- 分析前の前処理をスクリプトとして残せる
- 整形前後を表で比較し、再現可能な前処理として説明できる
まず押さえるポイント
文字列処理は地味だけれど実務で強い
元データを少し整えるだけで、集計・可視化・テキスト分析へ進みやすくなります。
「500ml」「商品名 + 容量」「県コード + ラベル」など、1列の中に情報が混ざっているデータはよくあります。手で直すこともできますが、R で処理してしまえば再現可能な前処理として残せます。
stringr は tidyverse に含まれているので、すでに library(tidyverse) を使っている人なら、そのまま導入しやすいのも利点です。
分析の前提
まず覚える5つの操作
検出
str_detect() でキーワードを含むかを TRUE/FALSE で返します。
置換
str_replace() で表記揺れや単語の置換を行います。
抽出
str_extract() で必要な部分だけ抜き出します。
分割
str_split() で区切り文字ごとに分解します。
数値化
readr::parse_number() で「500ml」から 500 を抜きます。
前提条件の確認
実行前に気をつけること
文字コード
CSV の文字化けや全角・半角の揺れがあると、想定したパターンにマッチしないことがあります。
正規表現の範囲
いきなり複雑な正規表現へ行くより、まず単純な文字列一致で試してから少しずつ広げる方が安全です。
元列を残す
前処理では、上書きではなく新しい列を作る方がトラブル時に戻りやすくなります。
整形前後を確認する
head() や View() で、期待通りに変換されたかを目視確認します。
データ構造
ここで使う最小例
このページでは、"Apple Juice 500ml" のような商品名ベクトルを使います。ひとつの文字列の中に、商品名・種類・容量が一緒に入っているので、検出・置換・抽出の練習に向いています。
R code
Rコードを順番に実行する
library(tidyverse)
products <- c(
"Apple Juice 500ml",
"Banana Juice 300ml",
"Orange Juice 1000ml",
"Grape Juice 400ml",
"Strawberry Juice 500ml"
)str_detect(products, "Banana")
str_replace(products, "Juice", "Smoothie")
str_extract(products, "[0-9]+ml")
readr::parse_number(products)
str_remove(products, " [0-9]+ml")str_length(products)
str_sub(products, 1, 6)
str_split(products, " ", simplify = TRUE)
str_flatten(products, collapse = " | ")出力の読み方
整形前後を表で比べる
文字列処理では、図よりも整形前後の表を並べて確認する方が実務的です。たとえば「元の文字列」「抽出した容量」「単位を除いた商品名」の3列を作っておくと、後工程で使いやすくなります。
図の読み方
このページでは表確認が主役
文字列処理では必ずしも図が必要ではありません。むしろ mutate() で新しい列を作り、select() や head() で変換結果を一覧する方が、前処理の確認としては確実です。
レポート文例
前処理をどう記述するか
日本語の例
商品名列に含まれていた容量情報は文字列処理により抽出し、分析用には数値列として再構成した。また、単位表記を除いた商品名列を別途作成し、集計用のカテゴリ変数として用いた。
English example
Volume information embedded in the product-name strings was extracted and reconstructed as a numeric variable. A separate product-name field without the unit information was also created for subsequent aggregation.
よくあるミス
つまずきやすい点
元列を上書きしてしまう
戻れなくなるので、新しい列を作る方が安全です。
正規表現を複雑にしすぎる
まずは単純なパターンで動かし、必要なときだけ広げます。
文字化けを無視する
エンコーディング問題はマッチ失敗の原因になります。
整形結果を確認しない
数行だけでも必ず before / after を見て確認します。
FAQ
よくある質問
Q. base R でもできますか?
A. はい。substr()、grep()、gsub() などでも可能です。ただし stringr の方が統一的で読みやすいです。
Q. 数値だけ抜きたいです。
A. readr::parse_number() がとても便利です。
Q. 日本語の自由記述にもそのまま使えますか?
A. 置換や検出は使えますが、日本語の単語分割は tidytext や quanteda、形態素解析系の手法へ進む方が良いです。
代替手法
代替手法・次のステップ
扱うデータの種類に応じて、base R、stringi、テキスト分析パッケージへ進みます。
base R の文字列関数
依存パッケージを増やしたくないときの基本です。
stringi
より低レベルで柔軟な文字列処理が必要なときの発展先です。
tidytext / quanteda
単語分割や頻度分析、共起、感情分析へ進みたいときの次の一歩です。
参考資料
参考資料
関数仕様を確認しながら、必要に応じて正規表現や text mining 系の資料へ進むのが分かりやすいです。
運営と利用上の注意
このページの位置づけ
本サイトのトピックページは、Rによるデータ分析の学習支援とレポート作成の補助を目的としたオリジナル解説です。サンプルデータとコードは再現練習用に作成しているため、実データを扱う際には研究計画・前提条件・欠測・外れ値・尺度水準をあらためて確認してください。
編集方針
ページ本文は、標準的な統計手法、Rの公式ドキュメント、一次資料に近い参考文献を優先して整理しています。更新や訂正の方針は編集方針ページで公開しています。