今回は、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))
検索してヒットした文字列をそのまま使うのではなく、それを削除したことで残りを利用するというところがポイントです。