具有数值向量的Levenshtein型算法

时间:2014-05-15 09:17:34

标签: r levenshtein-distance

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

v1 <- c(1, 3, 4, 5, 6, 7, 8)
v2 <- c(54, 23, 12, 53, 7, 8)

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

整数向量可以看作是以UTF-32编码的单个字符串(其中一个Unicode代码点表示为单个32位整数)。你可以获得一个普通的&#34;字符串,只需将这样的矢量转换为带有intToUtf8的UTF-8。

intToUtf8(c(65, 97))
## [1] "Aa"

顺便说一下,adist默认情况下会对其输入执行utf8ToInt(反向操作)。所以在内部,它根据整数向量计算结果。没什么大不了的。

这是解决方案。

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"

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

utf8ToInt(intToUtf8(c(2147483647)))
## 2147483647

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

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