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:
dobry punkt, make.unique daje brzydki mieszaninę B i B.x w tym przypadku. –
@akrun: Przepraszamy, że usunąłeś swoje rozwiązanie. –