2014-05-15 8 views
6

Ich habe zwei Vektoren mit numerischen Werten. WieLevenshtein-Typ-Algorithmus mit numerischen Vektoren

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

würde Ich mag die Anzahl der Einfügungen und Ersetzungen, Deletionen die ich einen Vektor in die andere drehen müssen berechnen mit bestimmt Kosten pro Operation c1c2 und c3 bzw.. Ich bin mir bewusst, dass die Funktion adist auf dem Basispaket dies für Strings tut, aber ich habe keine Kenntnis der entsprechenden Funktion mit Zahlen.

Ich dachte darüber nach, jede Zahl mit einem Buchstaben zu referenzieren, aber ich habe mehr als 2000 eindeutige Zahlen, also wenn jemand weiß, wie man 2000 verschiedene Zeichen in R bekommt, wäre das auch eine Lösung für mich.

Danke für Ihre Hilfe.

+0

26^3> 2000. Daher versuchen Sie 'combn (Buchstaben, 3)' –

+0

nicht einmal. combn (c (Buchstaben, Buchstaben), 2) wäre sogar besser. Aber das ist nicht der Punkt der Frage. – Usobi

Antwort

7

Ein ganzzahliger Vektor kann als einzelne Zeichenfolge in UTF-32 (in der ein Unicode-Codepunkt als einzelne 32-Bit-Ganzzahl dargestellt wird) angezeigt werden. Sie können eine "normale" Zeichenkette erhalten, indem Sie einfach einen solchen Vektor mit intToUtf8 in UTF-8 konvertieren.

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

Im Übrigen funktioniert adistutf8ToInt (op rückwärts) standardmäßig an seinen Eingängen sowieso. Also intern berechnet es die Ergebnisse nach ganzzahligen Vektoren. Kein großer Hack.

Dies ist die Lösung.

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" 

Der obige Code soll, wenn arbeitet mindestens alle Zahlen sind streng größer als 0 R ziemlich liberal Unicode-Codepunkte behandelt (in der Tat, zu großzügig, aber in diesem Fall sind Sie ein Gewinner), selbst die größtmögliche ganze Zahl akzeptiert wird:

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

Wenn Sie einen Vektor mit negativen Werten haben, können Sie es irgendwie umwandeln kann, zB mit x <- x-min(x)+1.

Wenn Sie unterschiedliche Kosten für das Einsetzen, Entfernen, Ersetzen benötigen, überprüfen Sie das adist'scosts Argument. Es gibt auch ein Paket namens stringdist, das viele andere String-Metriken enthält. Das obige Schema sollte auch dort funktionieren.

Verwandte Themen