具有数值向量的Levenshtein型算法

Uso*_*obi 6 r levenshtein-distance

我有两个带数值的向量.如

v1 <- c(1, 3, 4, 5, 6, 7, 8)
v2 <- c(54, 23, 12, 53, 7, 8)
Run Code Online (Sandbox Code Playgroud)

我想计算插入,删除替换的数量,我需要将一个向量转换为另一个向量,每个操作分别具有一定的成本c1 c2c3.我知道基础包上的函数adist为字符串执行此操作,但我不知道与数字等效的函数.

我想用一个字母引用每个数字,但我有超过2000个唯一数字,所以如果有人知道如何在R中获得2000个不同的字符,这对我来说也是一个解决方案.

谢谢你的帮助.

gag*_*ews 7

整数向量可以看作是以UTF-32编码的单个字符串(其中一个Unicode代码点表示为单个32位整数).您可以通过将这样的矢量转换为UTF-8来获得"普通"字符串intToUtf8.

intToUtf8(c(65, 97))
## [1] "Aa"
Run Code Online (Sandbox Code Playgroud)

顺便说一句,adistutf8ToInt(反向操作)默认情况下,在其输入反正.所以在内部,它根据整数向量计算结果.没有大的黑客.

这是解决方案.

adist(intToUtf8(c(1, 3, 4, 5, 6, 7, 8)), intToUtf8(c(54, 23, 12, 53, 7, 8)), counts=TRUE)
##      [,1]
## [1,]    5
## attr(,"counts")
## , , ins
## 
##      [,1]
## [1,]    0
## 
## , , del
## 
##      [,1]
## [1,]    1
## 
## , , sub
## 
##      [,1]
## [1,]    4
## 
## attr(,"trafos")
##      [,1]     
## [1,] "SSSSDMM"
Run Code Online (Sandbox Code Playgroud)

如果至少所有数字都严格大于0,则上述代码应该有效.R非常宽松地对待Unicode代码点(事实上,过于自由,但在这种情况下,你是胜利者),即使是最大可能的整数也被接受:

utf8ToInt(intToUtf8(c(2147483647)))
## 2147483647
Run Code Online (Sandbox Code Playgroud)

如果你有一个带负值的矢量,你可以用某种方式对其进行变换,例如x <- x-min(x)+1.

如果您需要不同的插入,移除,更换成本,请查看adist's costs参数.还有一个名为stringdist的包,其中包含许多其他字符串指标.上述方案也应该在那里工作.