如何使用替换距离在R中比较两个字符串以找到匹配字符的数量?

8
在R语言中,我有两个字符向量a和b。
a <- c("abcdefg", "hijklmnop", "qrstuvwxyz")
b <- c("abXdeXg", "hiXklXnoX", "Xrstuvwxyz")

我需要一个函数来计算a中每个元素与b中对应元素的字符不匹配次数。以上面的示例为例,这样的函数应该返回c(2,3,1)。不需要对齐字符串。 我需要逐个比较每对字符串中的字符,并计算每对中的匹配和/或不匹配情况。在R中是否存在这样的函数? 或者,换句话说,是否有一个函数可以给我两个字符串之间的编辑距离,其中唯一允许的操作是替换(忽略插入或删除)?

严格来说,这只是“替换距离”,而不是完整的“编辑距离”。 - smci
感谢您的纠正。 - Ryan C. Thompson
2个回答

8

使用一些 mapply 函数:

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

很抱歉,但那并不是我所要求的。它恰好在我的例子中给出了正确的答案,但如果字符串中有重复的字母,它将无法正常工作。例如,考虑 a <- "aaaaaaa"; b <- "aaaXaaa"。你的代码会返回6个不匹配,而正确的答案是1。 - Ryan C. Thompson
1
@RyanThompson - 好的 - 已经调整了答案以考虑重复。 - thelatemail
1
为了清晰起见,我会重命名变量和函数:substitution_distance <- function(s1,s2) { mapply(function(c1,c2) sum(c1!=c2), strsplit(s1,''), strsplit(s2,'')) } - smci

2
另一个选项是使用 adist,该函数计算字符向量之间的近似字符串距离:
mapply(adist,a,b)
abcdefg  hijklmnop qrstuvwxyz 
     2          3          1 

这两种解决方案并不完全可互换,尝试使用以下代码:a <- c("cdefgba", "hijklmnop", "qrstuvwxyz"),我的解决方案输出 c(7,3,1)adist 的输出为 c(6,3,1) - thelatemail
这个答案允许插入缺失字符,而我只是要求逐个字符进行比较。 - Ryan C. Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接