jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

R言語でパターンマッチング

今回は、R言語正規表現を利用したパターンマッチングの使用例を紹介します。

R言語のパターンマッチング:grepの場合

特定のテキストや文字列のリストに対して、任意のパターンを検索します。文字列がパターンを含んでいるとリスト内の位置を戻り値として出力します。また、パターンを含む文字列を返すこともできます。

characters <- "abcde"
grep("bc",characters)
#1が戻り値になります

charlist <- c("aaaaa","abcde")
grep("bc",charlist)
#2が戻り値になります

chalist <- c("aaaaa","abcde")
grep("bc",charlist, value = TRUE)
#"abcde"が出力されます。

R言語のパターンマッチング:subを利用する場合

sub関数はパターンマッチングした文字列を別の文字列に置換できます。これを利用して、少し特殊な使用方法を紹介します。例えば、何か売り買いをした記録をつけて次のようなデータを作ろうとしたとします。

日にち 行動 金額
1 sell 1000
2 buy 500
3 buy 300
4 sell 800

ところが実際には、行動と金額の間に分割文字を挿入し忘れて、次のようなデータになってしまいました。

日にち 行動金額
1 sell1000
2 buy500
3 buy300
4 sell800

幸いにも行動はアルファベット、金額は数字なので、正規表現でそれぞれを検索できればデータ処理できそうです。ただし、これはgrepではうまくいかないでしょう。grepではマッチするかどうかだけが判定されるからです。そこで、subを使っていらない部分を削除してみたいと思います。

#データ
datalist <- data.frame(date = c(1,2,3,4), behFee = as.character(c("sell1000","buy500","buy300","sell800")))
#sub関数で数字を削除したbehという変数とアルファベットを削除したfeeという変数を作成する。

datalist <- transform(datalist, beh = sub("[[:digit:]]+", replacement = "", behFee), fee = sub("[[:alpha:]]+", replacement = "", behFee))
#feeを数値に変換
datalist$fee <- as.numeric(as.character(datalist$fee))

検索してヒットした文字列をそのまま使うのではなく、それを削除したことで残りを利用するというところがポイントです。