Соответствие R игнорирует регистр и специальные символы - PullRequest
0 голосов
/ 21 февраля 2020

Я искал и нашел похожие ответы, но не совсем то, что мне нужно.

Я хочу идентифицировать совпадения в 2 строках, игнорируя регистр и пробелы и специальные символы.

list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')

Все ниже должен выдавать тот же вывод (1 2 3)

match(list1, list1)
match(list1, list2)
match(list1, list3)

Я пробовал str_detect(list1, regex(list2, ignore_case = TRUE)), но это не дает тот же тип вывода (и я не знаю, как включить специальные символы / пробелы там.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Видите, что @Allan Cameron опубликовал очень похожее решение прямо передо мной ... собираюсь оставить это в любом случае, потому что достаточно отличается ...?!

list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')

регулярное выражение для замены любого символа, который не является алфавитом c символ с пустой строкой:

f <- function(x) {
  return(tolower(gsub("[^[:alpha:]]", "", x)))
}

match(f(list1), f(list2))
match(f(list1), f(list3))
match(f(list2), f(list3))
2 голосов
/ 21 февраля 2020

Вы можете создать регулярное выражение, которое вытаскивает только буквы в середине строк, используя gsub, а затем преобразовывать их в нижний регистр. Затем вы можете использовать стандартный match на результат. Лучше всего поместить все это в свою собственную функцию:

list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')

match2 <- function(a, b)
{
  a <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", a))
  b <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", b))
  match(a, b)
}

match2(list1, list1)
#> [1] 1 2 3
match2(list1, list2)
#> [1] 1 2 3
match2(list1, list3)
#> [1] 1 2 3

Создано в 2020-02-21 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...