使用 Adist 确定哪个元素只需要删除

use adist to determine which element only needs deletions

提问人:smoff 提问时间:5/3/2023 更新时间:5/3/2023 访问量:55

问:

我有这个 (y) 和一个 (x),我想比较一下,看看哪个 y 最适合 x,如果只考虑删除。vectorstringsstring

x = "PCOR1"
y = c("PCor", "TCor", "TMMON", "INTMAX")

到目前为止,我尝试使用的是,但它导致了奇怪的结果:adist

adist(x,y,costs=c(substitutions = 0, insertions = 0, deletions = 1), ignore.case=TRUE)
      [,1] [,2] [,3] [,4]
[1,]    1    1    0    0

我可以仔细看看这个做法:

 drop(attr(adist(x,y,costs=c(substitutions = 0, insertions = 0, deletions = 1), ignore.case=TRUE, counts=TRUE),"counts"))
     ins del sub
[1,]   0   1   0
[2,]   0   1   1
[3,]   0   0   5
[4,]   1   0   5

现在告诉我,如果我做对了,我需要一次删除才能从“PCOR1”到“PCor”,一次删除和一次替换才能从“TCOR1”到“TCor”,依此类推。

如果我将插入和替换设置为 0,为什么会返回此值?有没有办法只使用删除?adist

我期望这样的事情:

     [,1] [,2] [,3] [,4]
[1,]   1    0    0    0
r 模糊比较

评论


答:

1赞 Sotos 5/3/2023 #1

如果它是原始字符串的子集,您似乎想返回它。在这种情况下应该足够了,即grepl()

sapply(y, grepl, x, ignore.case = TRUE)
# pcor   tcor  tmmon intmax 
# TRUE  FALSE  FALSE  FALSE 

sapply(y, grepl, x, ignore.case = TRUE) * 1
#PCor   TCor  TMMON INTMAX 
# 1      0      0      0  

评论

0赞 smoff 5/4/2023
不完全是。我需要确定是否包含任何 ,忽略大小写并允许最多删除两次,但不允许替换或插入。这是因为可能是另一个,例如它可能是“M”,当然,无论如何,它都是 Thanks for the reply 中所有字符串的子集yxxstringy