如何合并2个矢量交替索引?

时间:2014-09-21 17:25:40

标签: r vector merge

我想以这种方式合并2个向量:

a = c(1,2,3)
b = c(11,12,13)
merged vector : c(1,11,2,12,3,13)

我怎么能这样做?

5 个答案:

答案 0 :(得分:55)

这将使用rbind

c(rbind(a, b))

例如:

a = c(1,2,3)
b = c(11,12,13)

c(rbind(a,b))

#[1]  1 11  2 12  3 13 

答案 1 :(得分:14)

@jalapic的rbind()答案非常好。这是一个创建新向量的替代方法,然后为其分配交替值。

a <- c(1,2,3)
b <- c(11,12,13)

x <- vector(class(a), length(c(a, b)))
x[c(TRUE, FALSE)] <- a
x[c(FALSE, TRUE)] <- b
x
# [1]  1 11  2 12  3 13

还有一个显示append

c(sapply(seq_along(a), function(i) append(a[i], b[i], i)))
# [1]  1 11  2 12  3 13

答案 2 :(得分:3)

只是想添加一个更简单的解决方案,该解决方案适用于向量长度不等的情况,并且您希望将额外数据追加到最后。

> a <- 1:3
> b <- 11:17
> c(a, b)[order(c(seq_along(a)*2 - 1, seq_along(b)*2))]
 [1]  1 11  2 12  3 13 14 15 16 17

说明:

  • c(a, b)ab中创建值的向量。
  • seq_along(a)*2 - 1创建第一个length(a)奇数的向量。
  • seq_along(b)*2创建第一个length(b)偶数的向量。
  • order(...)将返回两个seq_along向量中的数字索引,以便x[order(x)]是有序列表。由于第一个seq_along包含偶数,第二个seq_along包含赔率,因此订单将从第一个seq_along开始,然后是第二个seq_along的第一个元素然后是来自第一个seq_along的第二个元素,等等两个矢量索引的散布,并将额外的数据留在尾部。
  • 通过使用c(a, b)向量对order建立索引,我们将会散布ab

请注意,由于seq_along在输入为numeric(0)时返回NULL,因此即使其中一个向量的长度为0,此解也会生效。

答案 3 :(得分:2)

我必须解决类似的问题,但我的矢量长度不等。并且,我不想回收较短的向量,而只是附加较长向量的尾部。

@RichardScriven的解决方案对我不起作用(尽管我可能做错了什么并且没有尽力排除故障)。

这是我的解决方案:

UserGroupModel.findById(userGroupId)
    .populate('users', 'username')
    .slice('users', -20)
    .select('-groupName')
    .lean()
    .exec(function(err, group){})

HTH, 马特

答案 4 :(得分:0)

@MBo在https://stackoverflow.com/a/58773002/2556061对我的问题的回答暗示了一种对长度不等的向量进行均匀隔行扫描的解决方案。我在这里报告以供参考。

interleave <- function(x, y)
{
  m <- length(x)
  n <- length(y)
  xi <- yi <- 1
  len <- m + n
  err <- len %/% 2
  res <- vector()
  for (i in 1:len)
  {
    err <- err - m
    if (err < 0)
    {

      res[i] <- x[xi]
      xi <- xi + 1
      err <- err + len
    } else
    {
       res[i] <- y[yi]
      yi <- yi + 1
     }
  }
  res
}

给予

interleave(1:10, 100:120)

c(100, 1, 101, 102, 2, 103, 104, 3, 105, 106, 4, 107, 108, 5, 109, 110, 111, 6, 112, 113, 7, 114, 115, 8, 116, 117, 9, 118, 119, 10, 120)