2014-05-15 3 views
6

숫자 값이있는 두 개의 벡터가 있습니다. 이러한숫자 벡터를 사용한 Levenshtein 유형 알고리즘

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

으로 나는 삽입, 삭제대체 내가 특정 조작 당 비용 (C1)C2과 함께 다른에 하나의 벡터를 설정해야의 수를 계산하고 싶습니다 c3입니다. 나는이 함수가 기본 패키지의 adobe이 문자열에 대해 이것을 수행하지만 숫자와 동일한 기능에 대한 지식이 없다는 것을 알고 있습니다.

나는 문자로 각 숫자를 참조하는 것에 대해 생각했지만 2000 개 이상의 고유 번호가 있으므로 아무도 R에서 2000 개의 다른 문자를 얻는 방법을 알고 있다면 나에게도 해결책이 될 것입니다.

도움 주셔서 감사합니다.

+0

26^3> 2000입니다. 따라서'combn (letters, 3)' –

+0

을 사용해보십시오. combn (c (letters, LETTERS), 2)는 더 좋을 것입니다. 하지만 그것은 중요한 질문이 아닙니다. – Usobi

답변

7

정수 벡터는 하나의 유니 코드 코드 포인트가 단일 32 비트 정수로 표시되는 UTF-32로 인코딩 된 단일 문자열로 볼 수 있습니다. 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" 

적어도 모든 숫자가 R은 (너무 자유롭게, 사실,하지만이 경우에 당신이 우승자) 매우 자유롭게 유니 코드 코드 포인트를 취급 엄격 큰 0보다 경우에 위의 코드는 작동합니다, 가능한 가장 큰 정수도 허용됩니다.

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

음수 값을 가진 벡터가있는 경우 어떻게 든 변환 할 수 있습니다. x <- x-min(x)+1.

삽입, 제거, 교체에 대해 다른 비용이 필요하면 adist'scosts 인수를 확인하십시오. stringdist이라는 패키지에도 다른 많은 문자열 메트릭이 포함되어 있습니다. 위의 구성표도 거기에서 작동해야합니다.