Объединить два вектора поочередно - PullRequest
0 голосов
/ 16 декабря 2018

Из этого поста поочередно, переплетения или чередования двух векторов был показан альтернативный способ комбинирования двух векторов:

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 ]

0 голосов
/ 16 декабря 2018

Другая возможность:

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
0 голосов
/ 16 декабря 2018

решение с использованием 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
0 голосов
/ 16 декабря 2018

Сначала разбейте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...