2017-03-16 115 views
2

我有像下面的biglist示例一樣的數據,它是2個列表中的2個列表。我想cbind列表中的第二個列表像下面的結果示例一樣列在一起。通常情況下,我會嘗試類似lapply(biglist,cbind),但我不確定如何使用列表清單來完成此操作。cbind列表的第二個元素列表在一起

Data: 
dput(biglist) 
list(list(list(1, 2, 3), list(5, 4, 6)), list(list(5, 9, 2), 
list(4, 6, 1))) 

Result: 
dput(result) 
structure(list(4, 6, 1, 5, 4, 6), .Dim = c(3L, 2L) 

回答

2

也許,這樣的事情?

matrix(unlist(lapply(bigList, function(x) x[2])), ncol = length(bigList)) 

#  [,1] [,2] 
#[1,] 5 4 
#[2,] 4 6 
#[3,] 6 1 

從每個列表以所述第二元件,然後unlist荷蘭國際集團的列表,並將其轉換成一個矩陣,其中列(ncol)的數目將是列表的length

2

隨着purrr,你可以做

library(purrr) 

bigList %>% map(2) %>% invoke(cbind, .) 
##  [,1] [,2] 
## [1,] 5 4 
## [2,] 4 6 
## [3,] 6 1 

或基礎R相當於:

do.call(cbind, lapply(bigList, `[[`, 2)) 
##  [,1] [,2] 
## [1,] 5 4 
## [2,] 4 6 
## [3,] 6 1 

,或者因爲它發生,這就是如何sapply簡化:

sapply(bigList, `[[`, 2) 
##  [,1] [,2] 
## [1,] 5 4 
## [2,] 4 6 
## [3,] 6 1 

的想法不管語法是提取每個子列表的第二個元素,然後將該列表作爲參數傳遞至cbind(嗯,實際上simplify2arraysapply之內)。如果您想按照所需結果反轉柱子,請在cbind之前在那裏夾一個rev

2

這裏是另一個版本mapply

mapply(`[[`, biglist, 2) 
# [,1] [,2] 
#[1,] 5 4 
#[2,] 4 6 
#[3,] 6 1 
1

相關的ronak-Shah的方法,你可以使用vapply從而簡化輸出自動產生一個矩陣。

vapply(bigList, function(i) unlist(i[[2]]), FUN.VALUE=numeric(3)) 
    [,1] [,2] 
[1,] 5 4 
[2,] 4 6 
[3,] 6 1 
相關問題