假設我在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 關注
- 606 瀏覽
添加回答
舉報
0/150
提交
取消