Как я могу сравнить две строки, чтобы найти количество символов, которые соответствуют в R, используя расстояние замены?

В R у меня есть два вектора символов, a и b.

a <- c("abcdefg", "hijklmnop", "qrstuvwxyz")
b <- c("abXdeXg", "hiXklXnoX", "Xrstuvwxyz")

Мне нужна функция, которая подсчитывает несоответствия символов между каждым элементом a и соответствующим элементом b. Используя приведенный выше пример, такая функция должна возвращать c(2,3,1). Струны выравнивать не нужно. Мне нужно сравнить каждую пару строк посимвольно и подсчитать совпадения и / или несоответствия в каждой паре. Существует ли такая функция в R?

Или, чтобы задать вопрос по-другому, существует ли функция, которая дает мне расстояние редактирования между двумя строками, где единственной разрешенной операцией является подстановка (игнорировать вставки или удаления )?


person Ryan C. Thompson    schedule 24.06.2013    source источник
comment
Строго говоря, это всего лишь расстояние замены, а не полное расстояние редактирования.   -  person smci    schedule 18.05.2014
comment
Спасибо за исправление.   -  person Ryan C. Thompson    schedule 20.05.2014


Ответы (2)


Используя немного mapply веселья:

mapply(function(x,y) sum(x!=y),strsplit(a,""),strsplit(b,""))
#[1] 2 3 1
person thelatemail    schedule 24.06.2013
comment
Мне очень жаль, но это не то, о чем я просил. В моем примере получилось дать правильный ответ, но это не сработало бы, если бы в строках были повторяющиеся буквы. Например, рассмотрим a <- "aaaaaaa"; b <- "aaaXaaa". Ваш код вернет 6 несоответствий, если правильный ответ - 1. - person Ryan C. Thompson; 25.06.2013
comment
@RyanThompson - Хорошо - скорректировал ответ с учетом повторов. - person thelatemail; 25.06.2013
comment
Для ясности я бы переименовал vars и fn: substitution_distance <- function(s1,s2) { mapply(function(c1,c2) sum(c1!=c2), strsplit(s1,''), strsplit(s2,'')) } - person smci; 18.05.2014

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

mapply(adist,a,b)
abcdefg  hijklmnop qrstuvwxyz 
     2          3          1 
person agstudy    schedule 24.06.2013
comment
Эти два решения не являются полностью взаимозаменяемыми, попробуйте: a <- c("cdefgba", "hijklmnop", "qrstuvwxyz"), мое решение дает c(7,3,1), а adist дает c(6,3,1) - person thelatemail; 25.06.2013
comment
Этот ответ позволяет использовать инделки, а я просто прошу посимвольное сравнение. - person Ryan C. Thompson; 25.03.2014