文字列操作のコマンドと文字列をパターン(キーワード)で検索する”grepコマンド”と置換する”gsubコマンド”を紹介します。正規表現での抽出も簡単に紹介します。
grepコマンドを使うことでデータの項目名などで繰り返しの処理ができます。
Rとウェブ解析:データフレームの項目名で処理を繰り返す
文字の置換に役に立つかもしれない記事の紹介です。
・Rで解析:文字操作が楽々「stringr」パッケージ
https://www.karada-good.net/analyticsr/r-640
コマンドはR version 4.1.3で確認しています。
文字列の置き換えなどのコマンド
空白を含む文字数のカウント、空白の削除、文字列の置き換え、文字列の切り出しに関するコマンドです。
#文字列の例、半角空白含めて16文字
# KARADANI EMONO
Test <- " KARADANI EMONO "
#文字数を確認
nchar(Test)
[1] 16
#半角空白を全て除く
gsub(" ", "", Test)
[1] "KARADANIEMONO"
#先頭の半角空白を除く
gsub("^ ", "", " KARADANI EMONO ")
[1] "KARADANI EMONO "
#最後尾の半角空白を除く
gsub(" $", "", " KARADANI EMONO ")
[1] " KARADANI EMONO"
#文字列から一部を取り出す
#4から11文字までを取り出す
substring(Test, 4, 11)
[1] "RADANI E"
#文字列の5と6文字目をXXに置き換える
substring(Test, 5, 6) <- "XX"
#置換前
[1] " KARADANI EMONO "
#置換後
Test
[1] " KARXXANI EMONO "
#空白を含む文字列を指定の長さで切り出す
strtrim(Test, 9)
[1] " KARADANI"
#文字を指定した内容で分割
#文字Aで分割
#指定した文字は消えてしまします
#結果はlistなのでunlistでベクトルにしています。
unlist(strsplit(Test, "A"))
[1] " K" "R" "D" "NI EMONO "
文字列の結合などのコマンド
文字列の結合、文字列ベクトルの作成、文字列の数字化などのコマンド
###文字列の結合コマンド:paste#####
#文字列例の作成
Text1 <- c("KARADA1", "KARADA2")
Text2 <- " NI "
Text3 <- "EMONO"
#各文字列の最後尾に半角空白が挿入され結合されます
paste(Text1, Text2, Text3)
[1] "KARADA1 NI EMONO" "KARADA2 NI EMONO"
#sepオプション""で空白を挿入せずに結合
paste(Text1, Text2, Text3, sep = "")
[1] "KARADA1 NI EMONO" "KARADA2 NI EMONO"
#collapseオプションは指定した文字列で
#文字列を結合して単一の文字列を作成します
paste(Text1, Text2, Text3, sep = "", collapse = " ? ")
[1] "KARADA1 NI EMONO ? KARADA2 NI EMONO"
#オプションが「sep = ""」専用のコマンド:paste0
#空白を挿入せずに結合
paste0(Text1, Text2, Text3)
[1] "KARADA NI EMONO"
########
#文字列ベクトルの作成
TsetChar <- character(10)
TsetChar
[1] "" "" "" "" "" "" "" "" "" ""
class(TsetChar)
[1] "character"
#文字列への変換
class(10)
[1] "numeric"
class(as.character(10))
[1] "character"
###数字の文字列を数字に変換:type.convertコマンド#####
Text1 <- "1"
Text2 <- "2"
#エラーが起きます
Text1 + Text2
Error in Text1 + Text2 : non-numeric argument to binary operator
#type.convertの使用
type.convert(Text1, as.is = TRUE) + type.convert(Text2, as.is = TRUE)
[1] 3
########
#アルファベットを出力する関数
#大文字
LETTERS[1:7]
[1] "A" "B" "C" "D" "E" "F" "G"
#小文字
letters[10:16]
[1] "j" "k" "l" "m" "n" "o" "p"
検索する”grepコマンド”と置換する”gsubコマンド”
内容はコメントを確認してください。
#からだにいいものタイトル
Test <- c("Rで解析:フォルダのコピーや作成など「pathological」パッケージの紹介とパッケージに依存しない方法",
"Rのガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?",
"Rで解析:画像のカラーコードを取得する方法!「EBImage」パッケージの紹介",
"Rでお遊び:プレゼン資料の配色に使えるかも?キャラクターの髪の色?")
###grepはキーワードを含む文字列の位置を出力#####
#紹介を含むタイトルの順位
grep("紹介", Test)
[1] 1 3
#grepを利用した文字列の抽出方法
#文字列にガイドを含むタイトルを抽出
Test[grep("ガイド", Test)]
[1] "Rのガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?"
#複数のキーワードも設定できます
#例はor"|"です
Test[grep("おねえさん|髪", Test)]
[1] "Rのガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?"
[2] "Rでお遊び:プレゼン資料の配色に使えるかも?キャラクターの髪の色?"
#正規表現も使えます
#先頭(^)に"Rの"の文字を含むタイトル
Test[grep("^Rの", Test)]
[1] "Rのガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?"
########
###gsubは対象キーワードに該当する文字列を指定内容で置換します#####
#gsub(対象キーワード, 指定内容, 文字列)
#おねえさんをおネイサンに置換
gsub("おねえさん", "おネエサン", Test)
[2] "Rのガイド:研究者も、社会人も、おネエサンも。とりあえず、みんなで使ってみませんか?"
#含まれる"の"を全て"が"に置換
gsub("の", "が", Test)
[1] "Rで解析:フォルダがコピーや作成など「pathological」パッケージが紹介とパッケージに依存しない方法"
[2] "Rがガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?"
[3] "Rで解析:画像がカラーコードを取得する方法!「EBImage」パッケージが紹介"
[4] "Rでお遊び:プレゼン資料が配色に使えるかも?キャラクターが髪が色?"
#最初に現れる"の"を"が"に置換
sub("の", "が", Test)
[1] "Rで解析:フォルダがコピーや作成など「pathological」パッケージの紹介とパッケージに依存しない方法"
[2] "Rがガイド:研究者も、社会人も、おねえさんも。とりあえず、みんなで使ってみませんか?"
[3] "Rで解析:画像がカラーコードを取得する方法!「EBImage」パッケージの紹介"
[4] "Rでお遊び:プレゼン資料が配色に使えるかも?キャラクターの髪の色?"
正規表現で文字列を抽出
正規表現でを使用した文字列の抽出例です。
Test <- c("KKKRRADAAA GOODDDDDD",
"kkkrraaadaaaaGoood",
"かかからららだだだいもののの",
"からだにいいもの")
#+の直前文字が1回以上繰り返すを抽出
Test[grep("ら+", Test)]
[1] "かかからららだだだいもののの" "からだにいいもの"
#文字と[^]の文字列を含まない文字列を抽出
Test[grep("だ[^に]い", Test)]
[1] "かかからららだだだいもののの"
#ある文字を含む文字列を抽出
Test[grep("A|に", Test)]
[1] "KKKRRADAAA GOODDDDDD" "からだにいいもの"
#特定パターンを抽出
Test[grep("ら.に", Test)]
[1] "からだにいいもの"
#+を組み合わせて特定パターンを抽出
Test[grep("A.+D", Test)]
[1] "KKKRRADAAA GOODDDDDD"
###ここから、使用する文字データ########
Test <- c("karada いいもの", "karadaいい もの",
"karada_いいもの", "からだにいいもの",
"からだに1いいもの", "からだに1223いもの",
"からだに12234535いいもの", "からだに13234535いいもの",
"からだに13234335いいもの", "0123-45-6789",
"012-3456-7895", "0123456789")
########
#空白を含む文字列にマッチ
Test[grep("\\s", Test)]
[1] "karada いいもの" "karadaいい もの"
#数字3の前に数字が3連続にマッチ
Test[grep("\\d{3}?3", Test)]
[1] "からだに1223いもの" "からだに12234535いいもの" "からだに13234535いいもの" "からだに13234335いいもの"
[5] "0123-45-6789" "0123456789"
#数字3が3回以上出現にマッチ
#Test[grep("(3.*){3}", Test)]
Test[grep("(3.*){3,}", Test)]
[1] "からだに13234535いいもの" "からだに13234335いいもの"
#数字3が2連続出現にマッチ
Test[grep("3{2}", Test)]
[1] "からだに13234335いいもの"
#ハイフンありの数字にマッチ
Test[grep("0\\d{1,4}-\\d{1,4}-\\d{4}", Test)]
[1] "0123-45-6789" "012-3456-7895"
#「いい」を含む文字列がマッチ
Test[grep("\\wいい", Test)]
[1] "karadaいい もの" "karada_いいもの" "からだにいいもの" "からだに1いいもの"
[5] "からだに12234535いいもの" "からだに13234535いいもの" "からだに13234335いいもの"
#「いい」を含まない文字列がマッチ
Test[grep("(*いい)", Test, invert = TRUE)]
[1] "からだに1223いもの" "0123-45-6789" "012-3456-7895" "0123456789"
#特殊文字(.など)をエスケープ:\\
grep("い\\.い", c("ii", "い.いい", "い. a", "いいい", "い9i", "い.9i"))
[1] 2
#任意の一文字にマッチ:.
grep("い.い", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 2 4
#ある文字から開始する文字にマッチ:^,.,*,$の組み合わせ
grep("^いい.*$", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 4
#ある文字で終了する文字にマッチ:^,.,*,$の組み合わせ
grep("^.*いい$", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 2 4
#英数字にマッチ:[A-Za-z0-9]
grep("[A-Za-z0-9]", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 1 3 5 6
#数字にマッチ:[0-9]
grep("[0-9]", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 6
#空白にマッチ:[[:space:]]
grep("[[:space:]]", c("ii", "い.いい", "い. a", "いいい", "い9i", "い9i"))
[1] 3
#ある拡張子を含む文字列にマッチ
#例ではwordの.doxcにマッチ
grep("^.*doxc*$", c("ii", "い.いい", "い.doxc", "いいい", "い9i", "い9i"))
[1] 3
#少数点を含む文字列にマッチ
grep("[+-]?\\d*\\.\\d", c("45454", "-8.0", "8.15452", "7.5", ".23", "い9i"))
[1] 2 3 4 5
#https/ftpを含む文字列にマッチ
grep("(https?|ftp)://([^:/]+)",
c("45454", "-8.0",
"https://www.karada-good.net/analyticsr/r-648/",
"7.5", ".23", "https://www.karada-good.net/"))
[1] 3 6
役に立つ記事の紹介
少しでも、あなたの解析が楽になりますように!!