如何基于管道运算符替换向量元素
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')
假设我有以下向量
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')