如何替换一组相同字符串中的一个字符(每个字符串中不保留不同字符)?

问题描述 投票:2回答:3

我具有相同元素的字符向量:

vec <- c("AXAXAXA", "AXAXAXA", "AXAXAXA")

我想将“ X”替换为“ Y”,但在每个字符串中都保留一个“ X”,在每个字符串中保留一个不同的,所以我得到

vec_res <- c("AXAYAYA", "AYAXAYA", "AYAYAXA")

字符串始终相同,向量中元素(字符串)的数量与每个字符串中“ X”的数量相同

我是sringr的新手,但我怀疑这样做可能有聪明的方法。

r stringr
3个回答
0
投票

另一个

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"

0
投票

利用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)

0
投票

我不确定这是一个非常普通的运算符,还是在这里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"
© www.soinside.com 2019 - 2024. All rights reserved.