文字列の抽出には、stringr
パッケージのstr_extract()
やstr_extract_all()
を使う。
また、数値の抽出には、readr
パッケージのparse_number()
も使える。
3つの関数のざっくりとしたイメージは以下の通り。
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()
は、正規表現を使って文字列を抽出できる。
正規表現の使い方については下記参照。
Rでよく使う正規表現のパターンを、カテゴリー別に整理してみた。 Rで使用する正規表現いろいろ 文字の検索・位置指定に関するパターン パターン 説明 例 ^ 文字列の先頭を指定 ^Hello は "Hello World" …
数字に関する正規表現の例
数字の抽出
最初の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.を使う。
データ整理の続き。 とある csv データを取り込み…… Data1