Tenho várias substituições de strings que preciso realizar consecutivamente em um vetor (ou seja, a próxima substituição é baseada na substituição anterior), mas não quero copiar e colar várias vezes enquanto estou tentando otimizar meus blocos de código .
Eu tenho um vetor:
initNames <- c("A.-.B", "A.B", "A0", "1 2", "AB BC")
Quero substituir elementos dentro do vetor para que a saída final fique assim:
newNames <- c("A - B", "A B", "Ao", "1.2", "AB.BC")
Eu posso conseguir isso desta forma:
newNames <- gsub(".-.", " - ", initNames, fixed = TRUE)
newNames <- gsub(".", " ", newNames, fixed = TRUE)
newNames <- gsub("A0", "Ao", newNames, fixed = TRUE)
newNames <- gsub("1 2", "1.2", newNames, fixed = TRUE)
newNames <- gsub("AB BC", "AB.BC", newNames, fixed = TRUE)
Mas quero fazer isso de forma otimizada. Eu tentei isso:
toreplace <- c(".-.", ".", "A0", "1 2", "AB BC")
replacements <- c(" - ", " ", "Ao", "1.2", "AB.BC")
initNames <- initNames %>% as_tibble()
newNames <- purrr::accumulate(initNames,
\(x, y) {
gsub(x = toreplace, y = replacements, initNames, fixed = TRUE)
})
Mas só mudou o primeiro valor. Também tentei usar purrr::map2()
, mas consegui uma lista em que cada elemento é substituído, mas não se baseia na substituição anterior:
newNames <- purrr::map2(toreplace, replacements, ~gsub(.x, .y, initNames, fixed = TRUE))
Alguém pode pensar em uma maneira de conseguir isso?
Muito obrigado!
Uma abordagem com
mapply
, usandogrepl
para encontrar cada correspondência.str_replace_all
pode fazer isso: