【发布时间】:2022-02-03 01:00:18
【问题描述】:
我有以下向量示例:
v1 <- c("AA", "BB")
v2 <- c("AA", "BB", "CCC")
请注意,每个向量的长度是可以变化的。
我想要做的是将每个向量与一个字符串交错:
linker <- "xxx"
导致:
c("AA", "xxx", "BB")
c("AA","xxx", "BB", "xxx", "CCC")
我怎样才能做到这一点?
【问题讨论】:
我有以下向量示例:
v1 <- c("AA", "BB")
v2 <- c("AA", "BB", "CCC")
请注意,每个向量的长度是可以变化的。
我想要做的是将每个向量与一个字符串交错:
linker <- "xxx"
导致:
c("AA", "xxx", "BB")
c("AA","xxx", "BB", "xxx", "CCC")
我怎样才能做到这一点?
【问题讨论】:
我们可以试试strsplit + paste0,如下所示
> strsplit(paste0(v2, collapse = sprintf(" %s ", linker)), " ")[[1]]
[1] "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"
【讨论】:
mapply 和c 的创意应用:
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"
【讨论】: