Как отфильтровать вектор строк в R на основе сопоставления строк - PullRequest
29 голосов
/ 25 августа 2011

У меня есть следующий вектор в R:

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

Как получить еще один вектор, который содержит только элементы, начинающиеся с "m" и заканчивающиеся на ".log"?

Ответы [ 4 ]

53 голосов
/ 25 августа 2011

вы можете использовать grepl с регулярным выражением:

X[grepl("^m.*\\.log", X)]
23 голосов
/ 25 августа 2011

Попробуйте это:

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

Разновидностью этого является использование глобуса, а не регулярного выражения:

grep(glob2rx("m*.log"), X, value = TRUE)
## [1] "mama.log"   "mentor.log"
4 голосов
/ 09 октября 2018

Документация на пакет stringr гласит:

str_subset() - это обертка вокруг x[str_detect(x, pattern)] и эквивалентна grep(pattern, x, value = TRUE).str_which() является оберткой вокруг which(str_detect(x, pattern)) и эквивалентно grep(pattern, x).

Так что, в вашем случае, более элегантный способ выполнить вашу задачу, используя tidyverse вместо базы Rвыглядит следующим образом.

library(tidyverse)

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

, который производит вывод:

[1] "mama.log"   "mentor.log"
1 голос
/ 27 декабря 2017

Использование труб ...

library(tidyverse)

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