Из списка я хочу извлечь оба вектора 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
s,
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
? Как? Или, может быть, есть другое, более эффективное решение Base 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)