我有两个带数值的向量。如
v1 <- c(1, 3, 4, 5, 6, 7, 8)
v2 <- c(54, 23, 12, 53, 7, 8)
我想计算插入,删除和替换的数量,我需要以一定的成本将一个向量转换为另一个向量每次操作 c1 c2 和 c3 。我知道基础包上的函数 adist 对字符串执行此操作,但我不知道具有数字的等效函数。
我想过用一个字母引用每个数字,但我有超过2000个唯一数字,所以如果有人知道如何在R中获得2000个不同的字符,这对我来说也是一个解决方案。
感谢您的帮助。
答案 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的包,其中包含许多其他字符串指标。上述方案也应该在那里工作。