R - подсчет совпадений между символами одной строки и другой, без замены

У меня есть ключевое слово (например, "зеленый" ) и некоторый текст ( "Мне не нравятся Сэм Я!" ).

Я хотел бы видеть, сколько символов в ключевом слове ('g', 'r', 'e', ​​'e', ​​'n') происходит в тексте (в любом порядке).

В этом примере ответ 3 - текст не имеет G или R, но имеет два Es и N.

Моя проблема возникает там, где, если символ в тексте сопоставляется с символом в ключевом слове, то он не может использоваться для сопоставления другого символа в ключевом слове.

Например, если мое ключевое слово было "greeen", количество "совпадающих символов" по-прежнему равно 3 (один N и два Es), потому что в тексте есть только два Es, а не 3 (чтобы соответствовать третьему E в ключевое слово).

Как я могу записать это в R? Это просто тикает что-то на краю моей памяти - я чувствую, что это общая проблема, но просто сформулированная по-разному (вроде как выборка без замены, но "совпадение без замены"?).

например.

keyword <- strsplit('greeen', '')[[1]]
text <- strsplit('idonotlikethemsamiam', '')[[1]]
# how many characters in keyword have matches in text,
# with no replacement?
# Attempt 1: sum(keyword %in% text)
# PROBLEM: returns 4 (all three Es match, but only two in text)

Дополнительные примеры ожидаемых ввода/вывода (ключевое слово, текст, ожидаемый результат):

  • 'green', 'idonotlikethemsamiam', 3 (G, E, E)
  • 'greeen', 'idonotlikethemsamiam', 3 (G, E, E)
  • 'red', 'idonotlikethemsamiam', 2 (E и D)

Ответ 1

Функция pmatch() отлично подходит для этого. Хотя здесь было бы инстинктивно использовать длину, длина не имеет параметра na.rm. Поэтому, чтобы обойти эту неприятность, используется sum (! Is.na()).

keyword <- unlist(strsplit('greeen', ''))
text <- unlist(strsplit('idonotlikethemsamiam', ''))

sum(!is.na(pmatch(keyword, text)))

# [1] 3

keyword2 <- unlist(strsplit("red", ''))
sum(!is.na(pmatch(keyword2, text)))

# [1] 2

Ответ 2

Возможно, вы ищете, чтобы найти UNIQUE компоненты вашего ключевого слова? Попробуйте:

keyword <- unique(strsplit('greeen','')[[1]])