2017-03-16 116 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 
相关问题