调查@tmfmnk的评论,看看trafos引导我采取以下方法。
返回字符串的部分,其中edit_string等于match的函数:
character_match = function(string, edit_string, match, drop = NA){
string = strsplit(string, "")[[1]]
edit_string = strsplit(edit_string, "")[[1]]
if(!is.na(drop)){
edit_string = edit_string[edit_string != drop]
}
if(length(string) != length(edit_string)){
stop("string and edit_string are different lengths")
}
output = rep("_", length(edit_string))
is_match = edit_string == match
output[is_match] = string[is_match]
output = paste0(output, collapse = "")
return(output)
}
应用于这个问题:
s1 = "123456789"
s2 = "0123zz67"
out = adist(s1, s2, counts = TRUE)
edit_string = drop(attr(out, "trafos"))
现在编辑字符串将包括以下字母代码:
- I = 插入
- M = 匹配
- S = 替换
- D = 删除
我们可以使用以下函数提取它们:
character_match(s1, edit_string, "M", "I")
character_match(s1, edit_string, "S", "I")
character_match(s1, edit_string, "D", "I")
character_match(s2, edit_string, "M", "D")
character_match(s2, edit_string, "S", "D")
character_match(s2, edit_string, "I", "D")
从这里很容易看出哪些字符和位置被插入、删除或替换。