アメリエフのブログ

バイオインフォマティクスの紹介と社員の日々
<< 数値をカンマで3ケタ区切りにする | main | カレンダーを見たい >>
続・Rでgrep
以前、Rのgrep()についての記事で、grep()は文字列のベクトルにのみ使えるとご紹介しましたが、今回はマトリクスやデータフレームではどうしたらよいか?という記事です。

例として以下のような文字列のマトリクスを用意しました。
1列目が季節、2列目が英語の月名の12行の文字列のマトリクスです。
> monthly
  season month
[1,] "winter" "January"
[2,] "winter" "February"
[3,] "spring" "March"
[4,] "spring" "April"
[5,] "spring" "May"
[6,] "summer" "June"
[7,] "summer" "July"
[8,] "summer" "August"
[9,] "autumn" "September"
[10,] "autumn" "October"
[11,] "autumn" "November"
[12,] "winter" "December"


さて突然ですが、牡蠣はお好きでしょうか?
嘘か本当か、牡蠣はrのつかない月に食べてはいけないと言われています。
そこで、用意したマトリクスから、牡蠣を食べてはいけない月を抜き出してみようと思います。
まず、月名のベクトル、つまりマトリクスの2列目のみを取得します。
> monthly[,2]
[1] "January" "February" "March" "April"
[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"


さっそく、このベクトルからrのつく月をgrep()で抜き出しましょう。
> r<-grep("r",monthly[,2])
> r

[1] 1 2 3 4 9 10 11 12


得られたのは、rのつく月の位置です。マトリクスmonthlyでいえば行数にあたりますので、rがつく月は以下の通り取得できます。
> monthly[r,]
  season month
[1,] "winter" "January"
[2,] "winter" "February"
[3,] "spring" "March"
[4,] "spring" "April"
[5,] "autumn" "September"
[6,] "autumn" "October"
[7,] "autumn" "November"
[8,] "winter" "December"


負号をつけると除外の意味になり、rがつかない月が得られます。
> monthly[-r,]
  season month
[1,] "spring" "May"
[2,] "summer" "June"
[3,] "summer" "July"
[4,] "summer" "August"


どうやら、五月、六月、七月、八月は牡蠣を避けた方がいいようです。
夏季なので、納得ですね。

しかし、この方法、
1.ベクトルを取得
2.ベクトルにgrep()して要素番号を取得
3.得られた要素へアクセス

と複数ステップ経なければいけないのが手間なので、もっと他に楽な方法をご存知の方がいたら教えて欲しいです。

目的の文字列を「含む」でははなく「完全一致」で検索したい場合はsubset()を使ったほうが簡単です。
例として、マトリクスmonthlyの1列目(season)が冬の行だけを取り出します。
> subset(monthly,monthly[,1]=="winter")
  season month
[1,] "winter" "January"
[2,] "winter" "February"
[3,] "winter" "December"
| kubo | 統計解析ソフトR | 16:00 | comments(2) | - |
必要な手順は,「必要」なので,他に旨い方法というのはないのでは?
一行で表すと
monthly[!(grepl("r", monthly[, 2])), ]
にはなるでしょうが。
grep ではなく,grepl を使うのが一つの工夫ではあるでしょうが。
| r-de-r | 2014/04/17 10:17 PM |
コメントありがとうございます。
やはりこれがべストに近い答えではあるのですね。
grepl関数を使う方法も教えていただきありがとうございます。
| kubo | 2014/04/18 6:36 PM |









1234567
891011121314
15161718192021
22232425262728
293031    
<< January 2017 >>

このページの先頭へ