2014-10-11 3 views
11

Я использую 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()?

ответ

19

Вы можете вставить жанры вместе с разделителем «или» | и запустить его через 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 
2

Вы можете перебирать список или вектор жанров, как показано ниже:

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

Чтобы ответить на ваш вопрос, если вы просто хотите знать, если any элемент результата ИСТИНА вы можете использовать функцию any() ,

any(sapply(genres, function(x) grepl(x, my_text))) 

Проще говоря, если любой элемент является TRUE, any возвратит TRUE.

+0

Это приближает меня к тому, что я ищу. Но я получаю значения TRUE/FALSE для каждого жанра. Если у меня есть массив из 20 жанров, я скажу 19 значений FALSE и 1 TRUE, если один из жанров содержался в my_text. Я хочу получить окончательный результат из этого высказывания 19 FALSE и 1 TRUE приравнивает TRUE в конце. Вы получаете то, что я говорю? Как я могу это сделать? – user3422637

+0

Я делаю над выражением if, чтобы убедиться, что условие возвращает true. – user3422637

+0

'any (sapply (...)' –