Отфильтруйте вектор строк на основе сопоставления строк

#r

Вопрос:

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

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

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

Ответ №1:

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

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

Комментарии:

1. Поскольку Андрей попросил шаблон для сопоставления строк, заканчивающихся на .log, я считаю, что это должно быть X[grepl(«^m.*\.log$», X)]

2. Точно. Я просто пропустил это. На этом все должно закончиться $ .

Ответ №2:

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

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

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

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

Комментарии:

1. Я не слышал о glob2rx, это здорово!

2. value = TRUE очень приятный и услужливый

Ответ №3:

В документации на 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. Вам нужно только загрузить library(stringr) вместо всех пакетов tidyverse.

Ответ №4:

С помощью труб…

 library(tidyverse)

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

Комментарии:

1. Это ничего не добавляет; это просто альтернативный синтаксис для функции, представленной в ответе кохске. Люди, которые знают, как использовать каналы, должны уже знать, как адаптировать синтаксис, и люди, которые не знают, как использовать каналы, будут сбиты с толку этим ответом, поскольку он не предлагает никаких объяснений.

2. Но даже с кратким объяснением труб, если кто-то задал вопрос «Как мне найти среднее значение вектора x «, и кто-то отвечает mean(x) , x %>% mean это не другой ответ.

3. Правильный. Они никогда не нужны , они просто вопрос стиля. И использование их или нет не меняет решения, которое заключается в «использовании grepl с этими аргументами…».

4. Я думаю, что они мне нужны, потому что я часто ими пользуюсь, поэтому я добавил ответ для тех, кто предпочитает использовать трубы.