我具有相同元素的字符向量:
vec <- c("AXAXAXA", "AXAXAXA", "AXAXAXA")
我想将“ X”替换为“ Y”,但在每个字符串中都保留一个“ X”,在每个字符串中保留一个不同的,所以我得到
vec_res <- c("AXAYAYA", "AYAXAYA", "AYAYAXA")
字符串始终相同,向量中元素(字符串)的数量与每个字符串中“ X”的数量相同
我是sringr
的新手,但我怀疑这样做可能有聪明的方法。
另一个
x <- 'AXAXAXA'
y <- grepRaw('X', x, all = TRUE)
x <- chartr('X', 'Y', rep(x, length(y)))
substr(x, y, y + 1) <- 'X'
x
# [1] "AXAYAYA" "AYAXAYA" "AYAYAXA"
利用purrr
的一个选项可能是:
map2_chr(.x = grepRaw("X", vec[1], all = TRUE),
.y = vec,
~ `substr<-`(gsub("X", "Y", .y), .x, .x, "X"))
[1] "AXAYAYA" "AYAXAYA" "AYAYAXA"
与base R
相同:
mapply(function(x, y) `substr<-`(gsub("X", "Y", y), x, x, "X"),
x = grepRaw("X", vec[1], all = TRUE),
y = vec)
我不确定这是一个非常普通的运算符,还是在这里Stringer会有所帮助。这是基本的R函数。由于输入向量的重复是多余的,因此此函数期望一个值,并将为每个X生成一个输出值。
swap_expand <- function(x) {
stopifnot(length(x)==1)
m <- gregexpr("X", x)
regmatches(x, m) <- "Y" #set all X's to Y
m <- m[[1]]
r <- rep(x, length(m)) #repeat for each X
substr(r, m, m)<-"X" #replace a different Y each time
r
}
swap_expand("AXAXAXA")
# [1] "AXAYAYA" "AYAXAYA" "AYAYAXA"