Je dois filtrer une trame de données en utilisant comme critère les lignes dans lesquelles est contenue la chaîne RTB
.
J'utilise dplyr
.
d.del <- df %>%
group_by(TrackingPixel) %>%
summarise(MonthDelivery = as.integer(sum(Revenue))) %>%
arrange(desc(MonthDelivery))
Je sais que je peux utiliser la fonction filter
dans dplyr
mais je ne sais pas exactement comment lui dire de vérifier le contenu d'une chaîne.
En particulier, je souhaite vérifier le contenu de la colonne TrackingPixel
. Si la chaîne contient l'étiquette, RTB
je souhaite supprimer la ligne du résultat.
dplyr
, mais en regardant l'aide,?dplyr::filter
je suggérerais quelque chose commefilter(df, !grepl("RTB",TrackingPixel))
peut-être?RTB
et de ne pas afficher les autres.!
devantgrepl
- réessayez.invert
etvalue
degrep
. Les expressions régulières facilitent mille fois le travail avec du texte.grepl
ne fonctionne pas sur postgres pour moi, est-ce pour MySQL?Réponses:
La réponse à la question a déjà été publiée par le @latemail dans les commentaires ci-dessus. Vous pouvez utiliser des expressions régulières pour le deuxième argument et les suivants
filter
comme ceci:Puisque vous n'avez pas fourni les données d'origine, j'ajouterai un exemple de jouet utilisant l'
mtcars
ensemble de données. Imaginez que vous ne soyez intéressé que par les voitures produites par Mazda ou Toyota.Si vous souhaitez faire l'inverse, à savoir exclure les voitures Toyota et Mazda, la
filter
commande ressemble à ceci:la source
mtcars$`my type` <- rownames(mtcars)
puismtcars %>% filter(grepl('Toyota|Mazda', `my type`))
tbl_sql
asgrepl
ne se traduit pas en sql.Solution
Il est possible d'utiliser
str_detect
lestringr
package inclus dans letidyverse
package.str_detect
renvoieTrue
ouFalse
indique si le vecteur spécifié contient une chaîne spécifique. Il est possible de filtrer en utilisant cette valeur booléenne. Voir Introduction à stringr pour plus de détails sur lestringr
package.Les bonnes choses à propos de Stringr
Nous devrions utiliser plutôt
stringr::str_detect()
quebase::grepl()
. C'est parce qu'il y a les raisons suivantes.stringr
package commencent par le préfixestr_
, ce qui facilite la lecture du code.stringr
package est toujours le data.frame (ou value), puis vient les paramètres. (Merci Paolo)Référence
Les résultats du test de référence sont les suivants. Pour les grandes trames de données,
str_detect
c'est plus rapide.la source
stringr
package commencent par le préfixe str_, ce qui facilite la lecture du code. Dans le code R moderne récent, il est recommandé d'utiliser stringr.base R
est aussi bon questringr
. Si vous pouviez nous fournir des «faits concrets» tels que l'analyse comparative, et non seulement dire «c'est recommandé» (qui le recommande?), Ce serait très apprécié. MerciCette réponse est similaire à d'autres, mais en utilisant préféré
stringr::str_detect
et déplyrrownames_to_column
.Créé le 2018-06-26 par le package reprex (v0.2.0).
la source
str_detect
est dans lestringr
paquetedit a inclus la nouvelle
across()
syntaxeVoici une autre
tidyverse
solution, en utilisantfilter(across())
ou précédemmentfilter_at
. L'avantage est que vous pouvez facilement étendre à plus d'une colonne .Ci-dessous également une solution avec
filter_all
pour trouver la chaîne dans n'importe quelle colonne, en utilisantdiamonds
comme exemple, la recherche de la chaîne "V"Chaîne dans une seule colonne
La syntaxe maintenant remplacée pour le même serait:
Chaîne dans toutes les colonnes:
La syntaxe maintenant remplacée pour le même serait:
J'ai essayé de trouver une alternative transversale pour ce qui suit, mais je n'ai pas immédiatement trouvé une bonne solution:
Mise à jour: Merci à l'utilisateur Petr Kajzar dans cette réponse , voici également une approche pour ce qui précède:
la source