R logo

文字列の抽出には、stringrパッケージのstr_extract()str_extract_all()を使う。

また、数値の抽出には、readrパッケージのparse_number()も使える。

3つの関数のざっくりとしたイメージは以下の通り。

str_extract(), str_extract_all(), parse_number()の特徴
  • str_extract():最初の一致を抽出
  • str_extract_all():すべての一致をリストで取得
  • readr::parse_number():数値型のベクトルを取得(自動で型変換)

これらの関数は、データのクリーニング、数値の抽出、テキスト処理に非常に便利。

stringrパッケージは、文字列処理に特化しており、正規表現を使って文字列を抽出する関数が豊富に用意されている。

readrパッケージは、データの読み込みや数値の抽出に特化している。

それぞれの関数を使うためには、まずパッケージをインストールして読み込む必要がある。

# stringrとreadrのインストール
install.packages("stringr")
install.packages("readr")
# パッケージの読み込み
library(stringr)
library(readr)

str_extract(string, pattern)

単一のマッチを抽出する関数

基本構文
str_extract(string, pattern)
  • 引数
    • string: 文字列または文字のベクトル
    • pattern: 正規表現のパターン
  • 戻り値
    • 最初に一致した文字列を返す(1つだけ)
    • string がベクトルの場合、各要素ごとに最初の一致部分を返す

使用例

最初の一致を抽出

str_extract("banana", "na")
output
"na" (最初の "na" に一致)
  • "a" "a" NA (cherry に "a" はない)

ベクトル内のすべての要素に適用

str_extract(c("banana", "apple", "cherry"), "a")
output
"a" "a" NA (cherry に "a" はない)
  • "a" "a" NA (cherry に "a" はない)

数字の抽出

str_extract("100.50", "\\d+")
output
"100" (最初の数字だけ抽出)
  • 数字だけを抽出
  • 小数点は抽出されない
ポイント
  • 最初の1つの一致だけを抽出する
  • もし複数の一致部分がある場合は、最初の1つだけが抽出される
  • 戻り値は文字列型 (character) で返される

str_extract_all(string, pattern)

すべてのマッチを抽出する関数

基本構文
str_extract(string, pattern)
  • 引数
    • string: 文字列または文字のベクトル
    • pattern: 正規表現のパターン
  • 戻り値
    • すべての一致部分のリストを返す
    • ベクトルの場合は、各要素の一致部分のリストを返す

使用例

すべての一致を抽出

str_extract_all("banana", "a")
output
list(c("a", "a"))
  • list(c("a", "a")) (2つの "a" が抽出)

ベクトル内のすべての要素に適用

str_extract_all(c("banana", "apple", "cherry"), "a")
output
list(c("a", "a"), c("a"), character(0))
  • list(c("a", "a"), c("a"), character(0)) (各要素から "a" を抽出)

複数の数字を抽出

str_extract_all("100.50 200.75 300.25", "\\d+")
output
list(c("100", "50"), c("200", "75"), c("300", "25"))
  • list(c("100", "50"), c("200", "75"), c("300", "25")) (各数字を抽出)
ポイント
  • すべての一致部分を抽出する
  • 戻り値はリスト形式(文字列ベクトルではなくリスト)
  • もしリストをフラットにしたい場合は、unlist() を使う

readr::parse_number()

数値の抽出専用の関数

基本構文
str_extract(string, pattern)
  • 引数
    • string: 文字列または文字のベクトル
  • 戻り値
    • 数字が抽出され、数値型 (numeric) のベクトルとして返される

使用例

文字列から数値の抽出

readr::parse_number("123.45")
output
123.45
  • 123.45 (数値として抽出される)

複数の文字列の数値を抽出

readr::parse_number(c("100.5", "200.75", "300.25"))
output
100.5 200.75 300.25
  • 数値型のベクトルとして返される

数値だけが含まれる場合

readr::parse_number("123")
output
123
  • 123 (数値として抽出される)
ポイント
  • 数値を自動的に抽出し、数値型 (numeric) に変換する
  • str_extract()str_extract_all() との違いは、**戻り値が「数値型」**になること
  • 小数点、マイナス記号も自動的に考慮される

str_extract() と str_extract_all() と parse_number()の違い

関数 主な用途 戻り値の型 複数の一致
str_extract() 最初の一致部分を抽出 文字列 1つだけ
str_extract_all() すべての一致部分を抽出 リスト (文字列ベクトル) すべて抽出
readr::parse_number() 数値を抽出し、数値型に変換 数値型 (numeric) 1つだけ (最初の数字)

どの関数をつかうか

やりたいこと 推奨する関数 理由
最初のマッチだけが欲しい str_extract() 最初の一致部分だけ抽出
すべてのマッチが欲しい str_extract_all() すべての一致部分をリストで取得
数値だけを抽出して数値型にしたい readr::parse_number() 数値型 (numeric) で取得
ベクトルの各要素から数値を抽出 readr::parse_number() すべての要素を一括処理
価格、重さ、数量を抽出したい readr::parse_number() 価格や重さの数値を数値型で抽出

正規表現を使う

str_extract()str_extract_all() は、正規表現を使って文字列を抽出できる。

正規表現の使い方については下記参照。

数字に関する正規表現の例

数字の抽出

最初の1つの数字を抽出 (最初の数字だけが欲しい)したい場合。

str_extract("My age is 25 and my brother is 30", "\\d+")
output
"25" (最初に一致する数値を抽出)

複数の数字をすべて抽出

すべての数字を抽出 (すべての数値が欲しい)したい場合。

str_extract_all("My age is 25 and my brother is 30", "\\d+")
output
list("25", "30")

電話番号の抽出

電話番号の形式 (XXX-XXXX-XXXX) に一致するものを抽出したい場合。

str_extract("Call me at 090-1234-5678", "\\d{3}-\\d{4}-\\d{4}")
output
"090-1234-5678"

価格の抽出

価格 ($100, $200) を抽出 (通貨記号と金額)したい場合。

str_extract_all("The prices are $100, $200, and $300", "\\$\\d+")
output
list("$100", "$200", "$300")

テキストパターンに関する正規表現の例

特定の単語の抽出

"apple" または "banana" を抽出したい場合。

str_extract("I like apple and banana", "apple|banana")
output
"apple" (最初に一致する "apple" を抽出)

すべての**"apple" または "banana"** を抽出したい場合。

str_extract_all("I like apple and banana", "apple|banana")
output
list("apple", "banana")

特定のフォーマットの文字を抽出

メールアドレスを抽出したい場合。

str_extract("Contact us at https://example.com", "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")
output
"support@example.com"

URLを抽出したい場合。

str_extract("Visit https://example.com for details", "https?://[\\w./]+")
output
"https://example.com"

日付の抽出

日付の形式 (yyyy/mm/dd) を抽出したい場合。

str_extract("Today's date is 2024/12/15", "\\d{4}/\\d{2}/\\d{2}")
output
"2024/12/15"

大文字と小文字の抽出

文字列からすべての大文字のアルファベットを抽出したい場合。

str_extract_all("abcXYZ123", "[A-Z]")
output
list("X", "Y", "Z")

文字列からすべての小文字のアルファベットを抽出したい場合。

str_extract_all("abcXYZ123", "[a-z]")
output
list("a", "b", "c")

繰り返しのあるパターンの抽出

繰り返しのある文字を抽出

"a" が1回以上連続する部分を抽出したい場合。

str_extract("aaabbbaaaccc", "a+")
output
"aaa"
str_extract_all("aaabbbaaaccc", "a+")
output
list("aaa", "aaa")

繰り返しのある数字の抽出

連続する2桁の数字を抽出したい場合。

str_extract_all("abc123def45ghi6789", "\\d{2}")
output
list("12", "45", "67", "89")

特殊なパターンの抽出

任意の1文字を抽出

"a" の後に任意の1文字が続くものを抽出したい場合。

str_extract_all("abc adc aec", "a.c")
output
list("abc", "adc", "aec")

先頭や末尾に一致するパターンの抽出

先頭が "Hello" で始まるかを判定したい場合。

str_detect("Hello World", "^Hello")

TRUE

末尾が "World" で終わるかを判定したい場合。

str_detect("Hello World", "World$")
output
TRUE

空白の抽出

すべての空白 (スペース) を抽出したい場合。

str_extract_all("Hello World 2024", "\\s")
output
list(" ", " ")

タブ文字の抽出

すべてのタブ (\t) を抽出したい場合。

str_extract_all("Hello\tWorld", "\\t")
output
list("\t")

特定の文字を含まない部分を抽出

a, b, c 以外の文字を抽出したい場合。

str_extract_all("abcdef", "[^abc]")
output
list("d", "e", "f")

先読みと後読みの正規表現

先読み (Lookahead)

数字の直前の部分を抽出したい場合。

str_extract("abc123", "(?=\\d)abc")
output
"abc"

後読み (Lookbehind)

数字の直後の部分を抽出したい場合。

str_extract("123abc", "(?
output
"abc"

置換したかったら、str_replacement

抽出するだけでなくて他の文字列に置換したい場合は、str_replace()str_replace_all()etc.を使う。