R: Нахождение нескольких совпадений строк в векторе строк - PullRequest
0 голосов
/ 20 мая 2018

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

files.list <- c("Fasted DWeib NoCmaxW.xlsx", "Fed DWeib NoCmaxW.xlsx", "Fasted SWeib NoCmaxW.xlsx", "Fed SWeib NoCmaxW.xlsx", "Fasted DWeib Cmax10.xlsx", "Fed DWeib Cmax10.xlsx", "Fasted SWeib Cmax10.xlsx", "Fed SWeib Cmax10.xlsx")

Я хочу определить, какие файлы имеют следующие подстроки:

toMatch <- c("Fasted", "DWeib NoCmaxW")

Примеры, которые я часто встречал в кавычкахследующее использование:

grep(paste(toMatch, collapse = "|"), files.list, value=TRUE)

Однако, это возвращает четыре возможности:

[1] "Fasted DWeib NoCmaxW.xlsx" "Fed DWeib NoCmaxW.xlsx"    "Fasted SWeib NoCmaxW.xlsx"
[4] "Fasted DWeib Cmax10.xlsx"  "Fasted SWeib Cmax10.xlsx" 

Я хочу имя файла, которое содержит оба элемента toMatch (то есть "Fasted" и "DWeib NoCmaxW"),Существует только один файл, который удовлетворяет этому требованию (files.list [1]).Я предположил, что "|"в команде вставки может быть логическое ИЛИ, и поэтому я попробовал «&», но это не решило мою проблему.

Может кто-нибудь помочь?

Спасибо.

1 Ответ

0 голосов
/ 20 мая 2018

Мы можем использовать &

i1 <- grepl(toMatch[1], files.list) & grepl(toMatch[2], files.list)

Если в toMatch есть несколько элементов, проходите через них с lapply и Reduce до одного логического vector с &

i1 <- Reduce(`&`, lapply(toMatch, grepl, x = files.list))
files.list[i1]
#[1] "Fasted DWeib NoCmaxW.xlsx"

Можно также свернуть элементы с помощью .*, т. Е. Соответствовать первому слову toMatch, за которым следует граница слова (\\b), а затем некоторые символы (.*).) и еще одна граница слова (\\b) перед вторым словом «toMatch».В этом примере это работает.Может быть, лучше добавить границу слова в начале и конце (что не нужно для этого примера)

pat1 <- paste(toMatch, collapse= "\\b.*\\b")
grep(pat1, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"

Но это будет искать совпадения в том же порядке слов в 'toMatch.В случае, если подстрока имеет обратный порядок и вы хотите сопоставить их, создайте pattern в обратном порядке и затем сверните с помощью |

pat2 <- paste(rev(toMatch), collapse="\\b.*\\b")
pat <- paste(pat1, pat2, sep="|")
grep(pat, files.list, value = TRUE) 
#[1] "Fasted DWeib NoCmaxW.xlsx"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...