web-dev-qa-db-fra.com

Filtrer un vecteur de chaînes en fonction de la correspondance de chaînes

J'ai le vecteur suivant:

X <- c("mama.log", "papa.log", "mimo.png", "mentor.log")

Comment récupérer un autre vecteur qui ne contient que des éléments commençant par "m" et se terminant par ".log"?

33
Andrey Adamovich

vous pouvez utiliser grepl avec une expression régulière:

X[grepl("^m.*\\.log", X)]
54
kohske

Essaye ça:

grep("^m.*[.]log$", X, value = TRUE)
## [1] "mama.log"   "mentor.log"

Une variante de ceci consiste à utiliser un glob plutôt qu'une expression régulière:

grep(glob2rx("m*.log"), X, value = TRUE)
## [1] "mama.log"   "mentor.log"
23
G. Grothendieck

La documentation sur le package stringr dit:

str_subset() est un wrapper autour de x[str_detect(x, pattern)], et est équivalent à grep(pattern, x, value = TRUE). str_which() est un wrapper autour de which(str_detect(x, pattern)), et est équivalent à grep(pattern, x).

Ainsi, dans votre cas, la manière la plus élégante d'accomplir votre tâche en utilisant tidyverse au lieu de la base R est la suivante.

library(tidyverse)

c("mama.log", "papa.log", "mimo.png", "mentor.log") %>% 
   str_subset(pattern = "^m.*\\.log")

ce qui produit la sortie:

[1] "mama.log"   "mentor.log"
6
Alexander

Utilisation de tuyaux ...

library(tidyverse)

c("mama.log", "papa.log", "mimo.png", "mentor.log") %>%
 .[grepl("^m.*\\.log$", .)]
[1] "mama.log"   "mentor.log"
2
user3357059