web-dev-qa-db-fra.com

Utilisez grepl pour rechercher l'une des sous-chaînes multiples dans un texte

J'utilise grepl () dans R pour rechercher si l'un des genres suivants existe dans mon texte. Je le fais comme ça en ce moment:

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) 

Existe-t-il une meilleure façon d'écrire ce code? Puis-je mettre tous les genres dans un tableau et ensuite utiliser grepl() à ce sujet?

14
user3422637

Vous pouvez coller les genres avec un "ou" | séparateur et exécutez-le via grepl comme une expression régulière unique.

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

Voici un exemple.

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

Vous pouvez parcourir une liste ou un vecteur de genres, comme ci-dessous:

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

Pour répondre à votre question, si vous voulez simplement savoir si l'élément any du résultat est VRAI, vous pouvez utiliser la fonction any().

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

Tout simplement, si un élément de est VRAI, any renverra VRAI.

3
Brandon Bertelsen