本文Alternate, interweave or interlace two vectors中展示了一种方便的方法,可以将两个向量交替组合:
x <- 1:3 ; y <- 4:6
c(rbind(x, y)) # [1] 1 4 2 5 3 6
但是,此方法仅适用于两个向量具有相同长度的条件。现在,我想找到一种通用的方法。
这是我的主意:
fun <- function(x, y, n) {...}
x
和y
是两个类型相同的向量,它们的长度可以不同。n
表示交替间隔,n <= length(x)
。预期输出:
x <- 1:5 ; y <- c(0, 0, 0)
fun(x, y, n = 1) # 1 0 2 0 3 0 4 5
fun(x, y, n = 2) # 1 2 0 3 4 0 5 0
fun(x, y, n = 5) # 1 2 3 4 5 0 0 0
感谢帮助。
答案 0 :(得分:6)
首先将x
分成n
组,然后将其堆叠到一个长的data.frame中。同样,将y
堆叠在一起,然后rbind
将这些数据帧堆叠在一起,按ind
(组号)对其进行排序,并占据values
列。
fun <- function(x, y, n) {
sx <- stack(split(x, c(gl(length(x), n, length(x)))))
sy <- stack(as.list(setNames(y, seq_along(y))))
r <- rbind(sx, sy)
r[order(r$ind), "values"]
}
x <- 1:5 ; y <- c(0, 0, 0)
fun(x, y, 1)
## [1] 1 0 2 0 3 0 4 5
fun(x, y, 2)
## [1] 1 2 0 3 4 0 5 0
fun(x, y, 5)
## [1] 1 2 3 4 5 0 0 0
答案 1 :(得分:4)
另一种可能性:
fun <- function(x, y, n){
c(x, y)[order(c(ceiling(seq_along(x) / n), seq_along(y)))]}
fun(x, y, 1)
# [1] 1 0 2 0 3 0 4 5
fun(x, y, 2)
# [1] 1 2 0 3 4 0 5 0
fun(x, y, 5)
# [1] 1 2 3 4 5 0 0 0
答案 2 :(得分:1)
使用Reduce
的解决方案:
n <- 2
res <- Reduce(function(x,i) append(x,y[i],i),n*(length(y):1), x)
res[is.na(res)] <- 0
res
# [1] 1 2 0 3 4 0 5 0