2014-05-15 12 views
6

Ho due vettori con valori numerici. ComeAlgoritmo di tipo Levenshtein con i vettori numerici

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

desidero calcolare il numero di inserzioni, delezioni e sostituzioni che devo trasformare un vettore nell'altro con alcuni costi per operazione c1c2 e c3 rispettivamente. Sono consapevole che la funzione Adist sul pacchetto base esegue questa operazione per le stringhe, ma non conosco la funzione equivalente con i numeri.

Ho pensato di fare riferimento a ogni numero con una lettera ma ho più di 2000 numeri univoci, quindi se qualcuno sa come ottenere 2000 caratteri diversi in R, sarebbe anche una soluzione per me.

Grazie per il vostro aiuto.

+0

26^3> 2000. Quindi prova 'combn (letters, 3)' –

+0

nemmeno. combn (c (letters, LETTERS), 2) sarebbe anche meglio. Ma non è questo il punto della domanda. – Usobi

risposta

7

Un vettore intero può essere visto come una singola stringa codificata in UTF-32 (in cui un punto di codice Unicode viene rappresentato come un singolo intero a 32 bit). È possibile ottenere una stringa "ordinaria", convertendo semplicemente un vettore in UTF-8 con intToUtf8.

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

proposito, adist fa utf8ToInt (op inversa) per impostazione predefinita sui suoi ingressi comunque. Quindi internamente, calcola i risultati in base ai vettori interi. Nessun grande hack.

Questa è la soluzione.

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" 

Il codice di cui sopra dovrebbe funzionare se almeno tutti i numeri sono strettamente maggiore di 0. R tratta punti di codice Unicode abbastanza liberamente (in realtà, troppo generosamente, ma in questo caso sei un vincitore), anche il più grande intero possibile è accettato:

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

Se si dispone di un vettore con valori negativi, si può trasformarlo in qualche modo, ad esempio, con x <- x-min(x)+1.

Se sono necessari costi diversi per l'inserimento, la rimozione, la sostituzione, consultare l'argomento adist'scosts. C'è anche un pacchetto chiamato stringdist, che includeva molte altre metriche di stringa. Lo schema sopra dovrebbe funzionare anche lì.