2013-06-24 2 views
6

В R у меня есть два вектора символов, a и b.Как сравнить две строки, чтобы найти количество символов, совпадающих в R, используя расстояние замещения?

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

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

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

+0

Собственно, это только *** замена расстояние ***, не полный *** редактирование расстояние ***. – smci

+0

Спасибо за исправление. –

ответ

6

Используя некоторые mapply удовольствие:

mapply(function(x,y) sum(x!=y),strsplit(a,""),strsplit(b,"")) 
#[1] 2 3 1 
+0

Извините, но это не делает то, что я просил. Это приводит к правильному ответу на мой пример, но это не сработает, если строки имеют повторяющиеся буквы. Например, рассмотрим 'a <-" aaaaaaa "; b <- "aaaXaaa". Ваш код вернет 6 несоответствий, когда правильный ответ будет равен 1. –

+1

@RyanThompson - Хорошо - настроили ответ на аккаунт для повторов. – thelatemail

+0

Хорошо, это выглядит хорошо. Благодаря! –

0

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

mapply(adist,a,b) 
abcdefg hijklmnop qrstuvwxyz 
    2   3   1 
+0

Два решения не являются полностью взаимозаменяемыми, попробуйте:' a <- c ("cdefgba", "hijklmnop", "qrstuvwxyz") ', мое решение дает' c (7,3, 1) 'while' adist' дает' c (6,3,1) ' – thelatemail

+0

Этот ответ позволяет indels, в то время как я просто прошу сравнение по каждому символу. –

 Смежные вопросы

  • Нет связанных вопросов^_^