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

Wic*_*elo 32 merge r vector

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

a = c(1,2,3)
b = c(11,12,13)
merged vector : c(1,11,2,12,3,13)
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

jal*_*pic 59

这将使用rbind:

c(rbind(a, b))
Run Code Online (Sandbox Code Playgroud)

例如:

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

c(rbind(a,b))

#[1]  1 11  2 12  3 13 
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案不适用于长度不同的矢量,@ RichardScriven的解决方案对于这种情况更稳健(如果`length(a)`大于`lenght(b)`或`max`的长度用于索引) . (2认同)

Ric*_*ven 14

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

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
Run Code Online (Sandbox Code Playgroud)

还有一个显示 append

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

  • @PatrickWilliams - `c(TRUE, FALSE)`,当用于索引时,意味着从**第一个**开始获取所有其他值。`c(TRUE, FALSE)` 在向量的整个长度中循环使用(因此在本例中就像说“是,否,是,否,是,否”)。另一方面,“c(FALSE TRUE)”以相同的方式获取从 **第二** 开始的所有其他值。 (3认同)

Bar*_*ker 6

只是想添加一个更简单的解决方案,该解决方案适用于向量长度不相等且您想要将额外数据附加到末尾的情况。

> 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
Run Code Online (Sandbox Code Playgroud)

说明:

  • c(a, b)a和中创建值的向量b
  • 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返回,所以即使向量之一是length,此解决方案也可以工作。numeric(0)NULL0

  • 我认为`c(a,b)[order(c(seq_along(a),seq_along(b))]]`应该可以。无需进行奇/偶计算。 (4认同)