35

次のように、必ずしも同じ長さではない、R に 2 つのリストがあるとします。

 a <- list('a.1','a.2', 'a.3')
 b <- list('b.1','b.2', 'b.3', 'b.4')

短いリストの要素が追加されると、長いリストの残りの要素が最後に追加される、インターリーブされた要素のリストを構築する最良の方法は何ですか?

interleaved <- list('a.1','b.1','a.2', 'b.2', 'a.3', 'b.3','b.4')

ループを使用せずに。mapplyは、両方のリストの長さが等しい場合に機能することを知っています。

4

5 に答える 5

5
interleave(a, b)

# unlist(interleave(a, b))
# [1] "a.1" "b.1" "a.2" "b.2" "a.3" "b.3" "b.4"


interleave <- function(a, b) { 

  shorter <- if (length(a) < length(b)) a else b
  longer  <- if (length(a) >= length(b)) a else b

  slen <- length(shorter)
  llen <- length(longer)


  index.short <- (1:slen) + llen
  names(index.short) <- (1:slen)

  lindex <- (1:llen) + slen
  names(lindex) <- 1:llen


  sindex <- 1:slen
  names(sindex) <- 1:slen

  index <- c(sindex, lindex)
  index <- index[order(names(index))]

  return(c(a, b)[index])

}
于 2013-05-08T15:02:20.193 に答える