Как извлечь определенный подуровень в глубоко вложенный список с помощью rapply? - PullRequest
1 голос
/ 09 мая 2019

Из списка я хочу извлечь оба вектора 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)
...