Как слить 2 вектора чередующихся индексов?
Я хотел бы объединить 2 вектора таким образом:
a = c(1,2,3) b = c(11,12,13) merged vector : c(1,11,2,12,3,13)
Как я могу это сделать?
- Объединить данные панели для получения данных балансной панели
- Алгоритм слияния N-way
- Как объединить hashи в Perl?
- Объединение словарей в C #
- R: объединить два нерегулярных временных ряда
Это будет работать с использованием 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
rbind()
by @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
И еще один, который показывает append
c(sapply(seq_along(a), function(i) append(a[i], b[i], i))) # [1] 1 11 2 12 3 13
Мне пришлось решить подобную проблему, но мои векторы имели неравную длину. И я не хотел перерабатывать более короткий вектор, но просто добавляю хвост более длинного вектора.
И решение для @RichardScriven не сработало для меня (хотя я, возможно, сделал что-то неправильно и не пытаюсь устранить неполадки).
Вот мое решение:
#' Riffle-merges two vectors, possibly of different lengths #' #' Takes two vectors and interleaves the elements. If one vector is longer than #' the other, it appends on the tail of the longer vector to the output vector. #' @param a First vector #' @param b Second vector #' @return Interleaved vector as described above. #' @author Matt Pettis riffle <- function(a, b) { len_a <- length(a) len_b <- length(b) len_comm <- pmin(len_a, len_b) len_tail <- abs(len_a - len_b) if (len_a < 1) stop("First vector has length less than 1") if (len_b < 1) stop("Second vector has length less than 1") riffle_common <- c(rbind(a[1:len_comm], b[1:len_comm])) if (len_tail == 0) return(riffle_common) if (len_a > len_b) { return(c(riffle_common, a[(len_comm + 1):len_a])) } else { return(c(riffle_common, b[(len_comm + 1):len_b])) } } # Try it out riffle(1:7, 11:13) [1] 1 11 2 12 3 13 4 5 6 7 riffle(1:3, 11:17) [1] 1 11 2 12 3 13 14 15 16 17
HTH, Мэтт
Просто хотелось добавить более простое решение, которое работает, когда векторы имеют неравную длину, и вы хотите добавить дополнительные данные в конец.
> 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)
создает вектор значений из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
и т.seq_along
,seq_along
два векторных индексов и оставляя лишние данные в хвосте. - Индексируя
c(a, b)
с помощью вектораorder
, мы будем пересекатьa
иb
.
В качестве примечания, поскольку seq_along
возвращает numeric(0)
когда вход NULL
это решение работает, даже если один из векторов равен длине 0
.