2016-01-28 11 views
5

Dato un vettore di iniziali non univoci paziente:elementi non unici disambiguare in un vettore carattere

init = c("AA", "AB", "AB", "AB", "AC") 

cerca di disambiguazione come segue:

init1 = c("AA", "AB01", "AB02", "AB03", "AC") 

cioè iniziali unici deve rimanere invariata, non univoco sono disambiguati aggiungendo numeri a due cifre.

risposta

4

Utilizzare la funzione indicata con ave:

uniquify <- function(x) if (length(x) == 1) x else sprintf("%s%02d", x, seq_along(x)) 
ave(init, init, FUN = uniquify) 
## [1] "AA" "AB01" "AB02" "AB03" "AC" 

Se il requisito fondamentale è solo quello di garantire uscita univoco quindi make.unique(x) o make.unique(x, sep = "0") come discusso da un'altra risposta e commenti sono concisa ma se il requisito è che l'uscita essere esattamente come nella domanda quindi non danno lo stesso risultato. Se ci sono 10 o più duplicati l'output di quelle risposte varia ancora di più; tuttavia, la soluzione qui dà la stessa risposta. Ecco un ulteriore esempio che illustra 10 o più duplicati.

xx <- rep(c("A", "B", "C"), c(1, 10, 2)) 
ave(xx, xx, FUN = uniquify) 
## [1] "A" "B01" "B02" "B03" "B04" "B05" "B06" "B07" "B08" "B09" "B10" "C01" "C02" 

La soluzione make.unique poterono essere salvati in questo modo:

+0

Buon punto, make.unique dà una brutta miscela di B e B.X in questo caso. –

+0

@akrun: Ci scusiamo per aver rimosso la soluzione. –

Problemi correlati