2016-01-28 4 views
5

Given wektorem nieunikalne inicjałami pacjentów:disambiguate nieunikalne elementy w postaci wektorowej

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

Szuka dezambiguacji w następujący sposób:

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

czyli unikatowe inicjały powinny pozostać na niezmienionym poziomie, nieunikalne są ujednoznaczniane poprzez dodanie dwucyfrowych liczb.

Odpowiedz

4

Użyj Wskazana funkcja z 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" 

Jeżeli podstawowym wymogiem jest tylko, aby zapewnić wyjątkową moc wtedy make.unique(x) lub make.unique(x, sep = "0") omówione przez inną odpowiedź i komentarz są zwięzłe, ale jeśli wymogiem jest, aby na wyjściu dokładnie tak jak w pytaniu, nie dają tego samego rezultatu. Jeśli istnieje 10 lub więcej duplikatów, wyniki tych odpowiedzi różnią się jeszcze bardziej; jednak rozwiązanie tutaj daje tę samą odpowiedź. Oto kolejny przykład ilustrujący 10 lub więcej duplikatów.

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" 

make.unique rozwiązanie można uratować jak poniżej:

+0

dobry punkt, make.unique daje brzydki mieszaninę B i B.x w tym przypadku. –

+0

@akrun: Przepraszamy, że usunąłeś swoje rozwiązanie. –