Filtrer plusieurs valeurs sur une colonne de chaîne dans dplyr

J’ai un data.frame avec des données de caractères dans l’une des colonnes. Je voudrais filtrer plusieurs options dans le data.frame de la même colonne. Y a-t-il un moyen facile de faire cela qui me manque?

Exemple: data.frame name = dat

 days name 88 Lynn 11 Tom 2 Chris 5 Lisa 22 Kyla 1 Tom 222 Lynn 2 Lynn 

Je voudrais filtrer Tom et Lynn par exemple.
Quand je fais:

 target <- c("Tom", "Lynn") filt <- filter(dat, name == target) 

Je reçois cette erreur:

 longer object length is not a multiple of shorter object length 

Vous avez besoin de %in% au lieu de == :

 library(dplyr) target < - c("Tom", "Lynn") filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target) 

Produit

  days name 1 88 Lynn 2 11 Tom 3 1 Tom 4 222 Lynn 5 2 Lynn 

Pour comprendre pourquoi, considérez ce qui se passe ici:

 dat$name == target # [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

Fondamentalement, nous recyclons le vecteur target deux longueurs quatre fois pour correspondre à la longueur de dat$name . En d’autres termes, nous faisons:

  Lynn == Tom Tom == Lynn Chris == Tom Lisa == Lynn ... continue repeating Tom and Lynn until end of data frame 

Dans ce cas, nous ne recevons pas d’erreur car je pense que votre bloc de données contient un nombre différent de lignes qui ne permettent pas le recyclage, mais l’exemple que vous fournissez le fait (8 lignes). Si l’échantillon avait eu un nombre impair de lignes, j’aurais eu la même erreur que vous. Mais même lorsque le recyclage fonctionne, ce n’est clairement pas ce que vous voulez. Fondamentalement, l’instruction dat$name == target équivaut à dire:

retourne TRUE pour chaque valeur impaire égale à “Tom” ou chaque valeur paire égale à “Lynn”.

Il se trouve que la dernière valeur de votre exemple de trame de données est égale et égale à “Lynn”, d’où celle ci-dessus.

En revanche, dat$name %in% target indique:

pour chaque valeur dans dat$name , vérifiez qu’elle existe dans la target .

Très différent. Voici le résultat:

 [1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE 

Notez que votre problème n’a rien à voir avec dplyr , mais bien la mauvaise utilisation de == .

En utilisant le package de base :

 df < - data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn")) # Three lines target <- c("Tom", "Lynn") index <- df$name %in% target df[index, ] # One line df[df$name %in% c("Tom", "Lynn"), ] 

Sortie:

  days name 1 88 Lynn 2 11 Tom 6 1 Tom 7 222 Lynn 8 2 Lynn 

En utilisant sqldf :

 library(sqldf) # Two alternatives: sqldf('SELECT * FROM df WHERE name = "Tom" OR name = "Lynn"') sqldf('SELECT * FROM df WHERE name IN ("Tom", "Lynn")') 

Cela peut être réalisé en utilisant le package dplyr, disponible dans CRAN. La manière simple d’y parvenir:

  1. Installez le paquet dplyr .

  2. library(dplyr) df< - select(filter(dat,name=='tom'| name=='Lynn',c('days','name))

Explication:

Ainsi, une fois que nous avons téléchargé dplyr, nous créons un nouveau bloc de données en utilisant deux fonctions différentes de ce package:

filter: le premier argument est le bloc de données; le second argument est la condition par laquelle nous voulons qu'il soit subséquent. Le résultat est l'intégralité du bloc de données avec uniquement les lignes souhaitées. select: le premier argument est le bloc de données; le second argument est le nom des colonnes que nous voulons sélectionner. Nous n'avons pas besoin d'utiliser la fonction names () et nous n'avons même pas besoin d'utiliser des guillemets. Nous listons simplement les noms des colonnes en tant qu'objects.