2013-01-23 23 views
10

私は一見とてもシンプルなことをやっています。 grepl()コマンド(またはそのようなもの)をループを構築せずにいくつかの異なるフレーズでRでデータフレームをサブセット化したいと思います。例えばgrepl()を使用した文字列のリストに基づくサブセット?

、私はボブやメアリーという名前の、誰のためのすべての行を引き出したいのですが:

## example data frame: 
tmp = structure(list(Name = structure(c(6L, 8L, 9L, 7L, 2L, 3L, 10L, 
1L, 5L, 4L), .Label = c("Alan", "Bob", "bob smith", "Frank", 
"John", "Mary Anne", "mary jane", "Mary Smith", "Potter, Mary", 
"smith, BOB"), class = "factor"), Age = c(31L, 23L, 23L, 55L, 
32L, 36L, 45L, 12L, 43L, 46L), Height = 1:10), .Names = c("Name", 
"Age", "Height"), class = "data.frame", row.names = c(NA, -10L 
)) 

tmp 

#   Name Age Height 
#1  Mary Anne 31  1 
#2 Mary Smith 23  2 
#3 Potter, Mary 23  3 
#4  mary jane 55  4 
#5   Bob 32  5 
#6  bob smith 36  6 
#7 smith, BOB 45  7 
#8   Alan 12  8 
#9   John 43  9 
#10  Frank 46  10 

## this doesn't work 
mynames=c('bob','mary') 
tmp[grepl(mynames,tmp$Name,ignore.case=T),] 

任意のアイデアが参考になります!

+0

'grep'ファミリの関数はパターンを指定する単一の文字列(固定文字列または正規表現)を必要とするため、コンソールで警告が表示されます。 '?grep'の文書には、「長さ2以上の文字ベクトルが与えられた場合、最初の要素は警告とともに使用されます。 –

答えて

26

mynamesベクトルと正規表現演算子|を組み合わせてgrepを使用できます。

tmp[grep(paste(mynames, collapse='|'), tmp$Name, ignore.case=TRUE),] 

#   Name Age Height 
# 1 Mary Anne 31  1 
# 2 Mary Smith 23  2 
# 3 Potter, Mary 23  3 
# 4 mary jane 55  4 
# 5   Bob 32  5 
# 6 bob smith 36  6 
# 7 smith, BOB 45  7 
+4

@Justin here '|'は論理的ではありませんが、正規表現の代替演算子ではありません(つまり、 'paste(mynames、collapse ="& ")'はあなたが期待することはできません)。 – hadley

+0

@hadley私はそれに応じて編集します。 – Justin