从一堆列表中,我想将两个向量c
和p
以及rbind
都提取到一个矩阵中。
列表如下:
List of 10
$ :List of 2
..$ :List of 3
.. ..$ c : int [1:2] 1 5
.. ..$ x1: num [1:10] -0.565 0.363 0.633 0.404 -0.106 ...
.. ..$ x2: num [1:10] 2.287 -1.389 -0.279 -0.133 0.636 ...
..$ p: int [1:10] 6 8 4 9 10 2 1 7 5 3
$ :List of 2
..$ :List of 3
.. ..$ c : int [1:2] 8 2
[...]
p
很简单,
do.call(rbind, sapply(L, "[", 2))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# p 6 8 4 9 10 2 1 7 5 3
# p 5 6 2 8 1 7 9 10 3 4
# p 10 8 1 3 9 5 6 7 4 2
# ...
但是这种方法将我引向sapply
的双c
,
do.call(rbind, sapply(sapply(L, `[`, 1), `[`, 1))
# [,1] [,2]
# c 1 5
# c 8 2
# ...
,可能有一种更有效的方法。
现在,我对rapply
感到困惑,并且不知道如何进入第二级。在?`[`
中寻找合适的参数后,我仅发现i
,
rapply(L, `[`, i=2, how="list")
但这会将子列表修剪为它们的第一个元素。
用sapply
可以代替双rapply
吗?怎么样?也许还有另一种更有效的基本R解决方案?
顺便说一句,之后我想申请colMeans
。
数据
set.seed(42)
L <- replicate(10, list(list(c=sample(10, 2), x1=rnorm(10), x2=rnorm(10)),
p=sample(10, 10)), simplify=FALSE)