test = select(-original) %>% # invert names, protecting a prefix mutate(test, name = str_replace(name, "El\\s", "El_") %>% str_invert %>% str_replace("_", " ")) %>% # find and number duplicate names group_by(name) %>% mutate(n = n(), o = 1:n()) %>% group_by() %>% mutate(name = ifelse(n > 1, str_c(name, "-", o), name)) %>% select(-n, -o) # sanity check: no duplicates rownames(test) = test$name # or, alternately stopifnot(!duplicated(test$name))