Частичное совпадение строк в R с использованием оператора% in%? - PullRequest
0 голосов
/ 18 июня 2019

Мне любопытно узнать, возможно ли частичное совпадение строк с помощью оператора% in% в R. Я знаю, что есть много способов использовать stringr и т. Д. Для поиска частичных совпадений строк, но мой текущий кодработает проще, используя оператор% in%.

Например, представьте себе этот вектор:

x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")

Я хочу, чтобы каждый из них был ИСТИНА, потому что строка содержит «Withdrawn», но тольково-первых, это ИСТИНА:

x %in% c("Withdrawn")
[1]  TRUE FALSE FALSE FALSE FALSE

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

x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE

Итак, возможно ли получить ИСТИНА для всехиз них с использованием оператора% in% с оберткой?Поскольку tolower () или toupper () легко использовать, я не , а , касающийся чувствительности к регистру;однако для меня важно, чтобы код вызывал «изъят», «снят» и «5 снят».

РЕДАКТИРОВАТЬ: Этот вопрос был помечен как дубликат этого вопроса Case-нечувствительный поиск списка в R ;однако, это отличается, потому что он спрашивает, возможно ли частичное совпадение строк, используя оператор% in%.В связанном вопросе оператор% in% вообще не используется.

1 Ответ

3 голосов
/ 18 июня 2019

%in% не поддерживает это: это оболочка для функции match, которая использует сравнение на равенство для установления совпадений, а не совпадения с регулярным выражением.Тем не менее, вы можете реализовать свои собственные:

`%rin%` = function (pattern, list) {
     vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}

И это может быть использовано как %in%:

〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE

Обратите внимание, что результат отличается от вашего требования работать так, как выожидать от grepl: сопоставление с образцом асимметричное , вы не можете поменять местами левую и правую стороны.Если вы просто хотите сопоставить список с одним регулярным выражением, используйте grepl напрямую:

〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE

Или, если вы предпочитаете использовать оператор:

`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE
...