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's
costs
. C'è anche un pacchetto chiamato stringdist, che includeva molte altre metriche di stringa. Lo schema sopra dovrebbe funzionare anche lì.
26^3> 2000. Quindi prova 'combn (letters, 3)' –
nemmeno. combn (c (letters, LETTERS), 2) sarebbe anche meglio. Ma non è questo il punto della domanda. – Usobi