web-dev-qa-db-ja.com

greplを使用して、テキスト内の複数の部分文字列のいずれかを検索します

Rでgrepl()を使用して、次のいずれかのジャンルがテキストに存在するかどうかを検索しています。私は今このようにしています:

_grepl("Action", my_text) |
grepl("Adventure", my_text) |  
grepl("Animation", my_text) |    
grepl("Biography", my_text) |  
grepl("Comedy", my_text) |    
grepl("Crime", my_text) |  
grepl("Documentary", my_text) |  
grepl("Drama", my_text) |  
grepl("Family", my_text) |  
grepl("Fantasy", my_text) |  
grepl("Film-Noir", my_text) |  
grepl("History", my_text) |  
grepl("Horror", my_text) |  
grepl("Music", my_text) |  
grepl("Musical", my_text) |  
grepl("Mystery", my_text) |  
grepl("Romance", my_text) |  
grepl("Sci-Fi", my_text) |  
grepl("Sport", my_text) |  
grepl("Thriller", my_text) |  
grepl("War", my_text) |    
grepl("Western", my_text) 
_

このコードを書くより良い方法はありますか?すべてのジャンルを配列に入れて、その上でgrepl()を使用できますか?

14
user3422637

「または」でジャンルを貼り付けることができます|セパレーターを使用し、greplを単一の正規表現として実行します。

x <- c("Action", "Adventure", "Animation", ...)
grepl(paste(x, collapse = "|"), my_text)

ここに例があります。

x <- c("Action", "Adventure", "Animation")
my_text <- c("This one has Animation.", "This has none.", "Here is Adventure.")
grepl(paste(x, collapse = "|"), my_text)
# [1]  TRUE FALSE  TRUE
32
Rich Scriven

以下のように、ジャンルのリストまたはベクトルを循環できます。

_genres <- c("Action",...,"Western")
sapply(genres, function(x) grepl(x, my_text))
_

質問に答えるために、結果のany要素がTRUEであるかどうかだけを知りたい場合は、any()関数を使用できます。

_any(sapply(genres, function(x) grepl(x, my_text)))
_

簡単に言うと、いずれかの要素がTRUEの場合、anyはTRUEを返します。

3