如何将字符串向量与字符串交错

How to interleave vector of strings with a string

我有以下向量示例:

v1 <- c("AA", "BB")
v2 <- c("AA", "BB", "CCC")

请注意,每个向量的长度可以变化。

我想做的是用一个字符串交错每个向量:

linker <- "xxx"

结果是:

c("AA", "xxx", "BB")
c("AA","xxx",  "BB", "xxx", "CCC")

我怎样才能做到这一点?

你可以在这里使用 rbind 技巧:

v1 <- c("AA", "BB")
v2 <- c("AA", "BB", "CCC")
linker <- "xxx"

head(c(rbind(v2, linker)), -1)

[1] "AA"  "xxx" "BB"  "xxx" "CCC"

这里有一个可能的答案:

v1 <- c("AA", "BB")

v2 <- c("AA", "BB", "CCC")

linker <- "xxx"

interleave <- function(v,l){

  result <- c()
  
  for(i in 1:length(v)){
    
    if(i!=1){
      
      result <- c(result,l,v[i])
      
    }else{
      
      result <- c(result,v[i])
      
    }
    
  }
  
  return(result)
  
}

interleave(v1,linker)

interleave(v2,linker)

结果:

> interleave(v1,linker)
[1] "AA"  "xxx" "BB" 
> 
> interleave(v2,linker)
[1] "AA"  "xxx" "BB"  "xxx" "CCC"

我们可以使用 append,然后 head 删除尾随链接器:

append_linker <- function(vector, linker){
lapply(vector, \(x) append(x, linker)) |>
        unlist() |>
        head(-1)
}

append_linker(v1, linker)

[1] "AA"  "xxx" "BB" 

append_linker(v2, linker)

[1] "AA"  "xxx" "BB"  "xxx" "CCC"

mapplyc 的创造性应用:

v1 <- c("AA", "BB")
v2 <- c("AA", "BB", "CCC")
linker <- 'xxx'

c(mapply(c, linker, v1))[-1]

[1] "AA"  "xxx" "BB"

c(mapply(c, linker, v2))[-1]

[1] "AA"  "xxx" "BB"  "xxx" "CCC"

我们可以像下面那样尝试 strsplit + paste0

> strsplit(paste0(v2, collapse = sprintf(" %s ", linker)), " ")[[1]]
[1] "AA"  "xxx" "BB"  "xxx" "CCC"