#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. Я думаю, что они мне нужны, потому что я часто ими пользуюсь, поэтому я добавил ответ для тех, кто предпочитает использовать трубы.