Используйте grepl для поиска любой из нескольких подстрок в тексте

Я использую grepl() в R для поиска, существует ли в моем тексте любой из следующих жанров. Я делаю это так прямо сейчас:

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() на этом?

Ответ 1

Вы можете вставить жанры вместе с разделителем "или" | и выполнить это через 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 результат TRUE, вы можете использовать функцию any().

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

Довольно просто, если любой элемент из TRUE, any вернет TRUE.