假设我在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))
当a
和b
都是列表,或者当a
和b
都是向量时,这同样有效。这不是OP问题的精确解决方案,因为当a
和b
具有不同的长度时,它将回收较短序列的元素,并显示警告。但是,由于此解决方案简单而优雅,并且提供了一个非常相似的问题的答案-一个像我这样的人的问题,他们因此找到了进入此页面的方式-似乎值得补充。
慕田峪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])}
- 3 回答
- 0 关注
- 563 浏览
添加回答
举报
0/150
提交
取消