利用数字向量的Levenshtein类型算法

6

我有两个包含数字值的向量。例如:

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

我希望能够计算出将一个向量转换为另一个向量所需的每个操作 c1 c2 c3 的特定成本,包括插入、删除和替换的次数。我知道基础软件包中的 adist 函数可以处理字符串,但我不知道相应的数字函数。
我考虑用字母引用每个数字,但我有超过2000个唯一的数字,因此如果有人知道如何在R中获取2000个不同字符,那对我来说也是一个解决方案。
谢谢您的帮助。

26的3次方大于2000。因此请尝试使用combn(letters,3) - Gary Weissman
不使用even函数,combn(c(letters, LETTERS), 2)会更好。但这不是问题的重点。 - Usobi
1个回答

7

一个整数向量可以看作是使用UTF-32编码的单个字符串(其中一个Unicode代码点被表示为单个32位整数)。您可以通过使用intToUtf8将这样的向量转换为“普通”字符串。

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
如果需要不同的插入、删除、替换成本,请查看adistcosts参数。还有一个名为stringdist的包,其中包含许多其他字符串度量标准。上述方案在那里也应该有效。

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