1
votes

Lignes de sous-ensemble dans une trame de données R basée sur une correspondance partielle de plusieurs chaînes

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!


0 commentaires

5 Réponses :


1
votes

Utilisez grep

> data[grep(paste0(remove_if, collapse = "|"), data$phrase, invert = TRUE), ]
  id              phrase
2  2 horse, bunny, mouse
4  4  monkey, chimp, cow


0 commentaires

1
votes

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


1 commentaires

A travaillé comme prévu sur le vrai jeu de données - merci!



0
votes

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


0 commentaires

1
votes
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'

0 commentaires

1
votes

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


0 commentaires