How to merge 2 vectors alternating indexes?
I would like to merge 2 vectors this way :
a = c(1,2,3)
b = c(11,12,13)
merged vector : c(1,11,2,12,3,13)
How could I do it ?
Solution 1:
This will work using rbind
:
c(rbind(a, b))
For example:
a = c(1,2,3)
b = c(11,12,13)
c(rbind(a,b))
#[1] 1 11 2 12 3 13
Solution 2:
The rbind()
answer by @jalapic is excellent. Here's an alternative that creates a new vector then assigns the alternating values to it.
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
And one more that shows append
c(sapply(seq_along(a), function(i) append(a[i], b[i], i)))
# [1] 1 11 2 12 3 13
Solution 3:
Just wanted to add a simpler solution that works for when vectors are unequal length and you want to append the extra data to the end.
> 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
Explanation:
-
c(a, b)
creates a vector of the values ina
andb
. -
seq_along(a)*2 - 1
creates a vector of the firstlength(a)
odd numbers. -
seq_along(b)*2
creates a vector of the firstlength(b)
even numbers. -
order(...)
will return the indexes of the numbers in the twoseq_along
vectors such thatx[order(x)]
is an ordered list. Since the firstseq_along
contains the even numbers and the secondseq_along
has the odds, order will take the first element from the firstseq_along
, then the first elements of the secondseq_along
, then the second element from the firstseq_along
, etc. interspersing the two vector indexes and leaving the extra data at the tail. - By indexing
c(a, b)
using theorder
vector, we will interspersea
andb
.
As a note, since seq_along
returns numeric(0)
when the input is NULL
this solution works even if one of the vectors is length 0
.