cbind列表的第二个元素列表在一起
问题描述:
我有像下面的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)
答
也许,这样的事情?
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
。
答
随着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
(嗯,实际上simplify2array
在sapply
之内)。如果您想按照所需结果反转柱子,请在cbind
之前在那里夹一个rev
。
答
这里是另一个版本mapply
mapply(`[[`, biglist, 2)
# [,1] [,2]
#[1,] 5 4
#[2,] 4 6
#[3,] 6 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