为了账号安全,请及时绑定邮箱和手机立即绑定

R中的交织列表

R中的交织列表

ABOUTYOU 2019-09-26 14:36:38
假设我在R中有两个列表,长度不一定相等,例如: 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适用于两个列表长度相等的情况。
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

在调查类似的问题,我碰到这个由格罗腾迪克的Gabor(即漂亮的解决方案@GGrothendieck?)某些情况下:

c(rbind(a,b))

ab都是列表,或者当ab都是向量时,这同样有效。这不是OP问题的精确解决方案,因为当ab具有不同的长度时,它将回收较短序列的元素,并显示警告。但是,由于此解决方案简单而优雅,并且提供了一个非常相似的问题的答案-一个像我这样的人的问题,他们因此找到了进入此页面的方式-似乎值得补充。


查看完整回答
反对 回复 2019-09-26
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

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])}


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 519 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信