我需要在向量中连续实现几个字符串替换(即,下一个替换基于前一个替换),但我不想多次复制和粘贴,因为我正在尝试优化我的代码块。
我有一个向量:
initNames <- c("A.-.B", "A.B", "A0", "1 2", "AB BC")
我想替换向量中的元素,以便最终输出如下所示:
newNames <- c("A - B", "A B", "Ao", "1.2", "AB.BC")
我可以这样实现:
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)
但我想以优化的方式做到这一点。我试过这个:
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)
})
但它只改变了第一个值。我也尝试过使用purrr::map2()
,但得到了一个列表,其中每个元素都被替换,但并不基于之前的替换:
newNames <- purrr::map2(toreplace, replacements, ~gsub(.x, .y, initNames, fixed = TRUE))
有人能想出一种方法来实现这一目标吗?
太感谢了!
一种方法
mapply
,使用grepl
来查找每个匹配项。str_replace_all
可以这样做: