Je ne pense pas que cette question exacte ait été posée - beaucoup de choses sur le sous-ensemble basé sur une valeur (par exemple, x [grepl ("some string", x [["column1"]]),]
), mais pas plusieurs valeurs / chaînes.
Voici un exemple de mes données:
id phrase 1 2 horse, bunny, mouse 2 4 monkey, chimp, cow
Cela donnera un ensemble de données qui ressemble à: p>
id phrase 1 1 dog, frog, cat, moose 2 2 horse, bunny, mouse 3 3 armadillo, cat, bird, 4 4 monkey, chimp, cow
Je souhaite supprimer la ligne 1 et la ligne 3 (car la ligne 1 contient «chien» et la ligne 3 contient «chat»), mais gardez la ligne 2 et la ligne 4. p >
#create sample data frame data = data.frame(id = c(1,2,3,4), phrase = c("dog, frog, cat, moose", "horse, bunny, mouse", "armadillo, cat, bird,", "monkey, chimp, cow")) #convert the `phrase` column to character string (the dataset I'm working on requires this) data$phrase = data$phrase #list of strings to remove rows by remove_if = c("dog", "cat")
En d'autres termes, je souhaite sous-définir les données
de manière à ce que ce ne soit que (les en-têtes et) les lignes 2 et 4 (car elles ne contiennent ni "chien "ni" cat ").
Merci!
5 Réponses :
Utilisez grep
> data[grep(paste0(remove_if, collapse = "|"), data$phrase, invert = TRUE), ] id phrase 2 2 horse, bunny, mouse 4 4 monkey, chimp, cow
Nous pouvons utiliser grepl
avec subset
après avoir coller
le 'remove_if' dans une seule chaîne
subset(data, !grepl(paste(remove_if, collapse="|"), phrase)) # id phrase #2 2 horse, bunny, mouse #4 4 monkey, chimp, cow
A travaillé comme prévu sur le vrai jeu de données - merci!
Une autre façon (peut-être pas la meilleure):
data[-unique(unlist(sapply(c(remove_if),function(x){grep(x,data$phrase)}))),] id phrase 2 2 horse, bunny, mouse 4 4 monkey, chimp, cow
data[!grepl(paste0("(^|, )(", paste0(remove_if, collapse = "|"), ")(,|$)"), data$phrase),] # id phrase # 2 caterpillar, bunny, mouse # 4 monkey, chimp, cow the regex constructed in this example is "(^|, )(dog|cat)(,|$)", to avoid matching words that contain 'cat' or 'dog', but aren't actually the exact words, e.g. 'caterpillar'
Si vous souhaitez le mélanger avec dplyr
et stringr
:
library(stringr) library(dplyr) data %>% filter(str_detect(phrase, paste(remove_if, collapse = "|"), negate = TRUE)) # id phrase # 1 2 horse, bunny, mouse # 2 4 monkey, chimp, cow