代码之家  ›  专栏  ›  技术社区  ›  Darren Tsai

交替组合两个矢量

r
  •  3
  • Darren Tsai  · 技术社区  · 6 年前

    从这个帖子, 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
    

    谢谢你的帮助。

    3 回复  |  直到 6 年前
        1
  •  4
  •   Henrik plannapus    6 年前

    另一种可能性:

    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
  •  6
  •   G. Grothendieck    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
    
        3
  •  1
  •   moodymudskipper    6 年前

    使用的解决方案 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