如何基于管道运算符替换向量元素

How to replace elements of vectors based on pipe operator

假设我有以下向量

Vec = c("AA", "BB1", "CC2")

现在我想根据模式匹配替换一些特定元素,如下所示

Vec[grepl("[0-9]+$", Vec)] <- paste("CCC", grep("[0-9]+$", Vec, value = T))
Vec
## [1] "AA"      "CCC BB1" "CCC CC2"

如何使用 pipe 运算符执行上述步骤?下面是我的尝试

library(dplyr)

Vec = c("AA", "BB1", "CC2")
Vec %>% `<-`(.[grepl("[0-9]+$", .)], paste("CCC", grep("[0-9]+$", ., value = T)))

有了这个,我得到了以下错误

Error in Vec %>% (.[grepl("[0-9]+$", .)] <- paste("CCC", grep("[0-9]+$",  : 
  incorrect number of arguments to "<-"

什么是正确的做法?

grepl 结果的长度为 2,而您的 Vec 的长度为 3,这就是参数数量不正确的原因。所以在 {} 中我们可以做 grepl 的事情,但是为了返回整个向量我们需要另一个 . 这是一个单独的代码行 ;.

library(dplyr)
Vec = c("AA", "BB1", "CC2")
Vec %>% {`<-`(.[grepl("[0-9]+$", .)], paste("CCC", grep("[0-9]+$", ., value = T)));.}
# [1] "AA"      "CCC BB1" "CCC CC2"

或者您可以使用 replace

Vec %>% replace(grepl("[0-9]+$", .), paste("CCC", grep("[0-9]+$", ., value=TRUE)))
# [1] "AA"      "CCC BB1" "CCC CC2"

您也可以使用 str_replace:

Vec %>%
     str_replace('(.*[0-9]+)$', 'CCC \1')