Обработка вложенных списков в R - PullRequest
0 голосов
/ 07 мая 2018

У меня есть вложенный список со следующей структурой: enter image description here

Каждый $mu - это вектор из 15 чисел. Как рассчитать среднее значение каждого из 15 элементов по 1000 $mu?

Я знаю, что могу получить доступ к $mu с помощью hb.post.PT1$compdraw[[1]]$mu, но как мне извлечь или зациклить их для выполнения функций?

Я пробовал подобные вещи без успеха:

lapply(hb.post.PT1$compdraw, function(x) lapply(hb.post.PT1$compdraw[[x]]$mu, function(x) mean))

Мои извинения, я не могу опубликовать пример списка данных.

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Может быть излишним для этого случая, но для такого рода проблем в целом хорошо помнить о purrr::transpose

map(transpose(hb.post.PT1$compdraw)$mu,mean)
0 голосов
/ 07 мая 2018

Вы можете использовать

hb.post.PT1$compdraw %>%
 purrr::map(function(x) {
   mean(x$mu)
 }) %>% unlist
0 голосов
/ 07 мая 2018

Вот как бы я это сделал с purrr::imap с тидиверса. Мы можем применить функцию, которая создает tbl с индексом списка и средним значением вектора mu этого индекса, и связать их в один кадр данных для удобного отображения.

library(tidyverse)
set.seed(12345)
testlist <- list(
  list(mu = rnorm(15), rooti = rnorm(15)),
  list(mu = rnorm(15), rooti = rnorm(15)),
  list(mu = rnorm(15), rooti = rnorm(15)),
  list(mu = rnorm(15), rooti = rnorm(15)),
  list(mu = rnorm(15), rooti = rnorm(15))
)
str(testlist[1:2])
#> List of 2
#>  $ :List of 2
#>   ..$ mu   : num [1:15] 0.586 0.709 -0.109 -0.453 0.606 ...
#>   ..$ rooti: num [1:15] 0.817 -0.886 -0.332 1.121 0.299 ...
#>  $ :List of 2
#>   ..$ mu   : num [1:15] 0.812 2.197 2.049 1.632 0.254 ...
#>   ..$ rooti: num [1:15] 1.461 -1.413 0.567 0.583 -1.307 ...

testlist %>%
  imap_dfr(.f = ~ tibble(index = .y, mu_mean = mean(.x$mu)))
#> # A tibble: 5 x 2
#>   index mu_mean
#>   <int>   <dbl>
#> 1     1  0.0341
#> 2     2  0.448 
#> 3     3  0.146 
#> 4     4 -0.130 
#> 5     5  0.244

Создано в 2018-05-07 пакетом Представить (v0.2.0).

0 голосов
/ 07 мая 2018

Вы уже просматриваете каждый элемент списка с первым lapply. Таким образом, на основе вашей структуры каждая итерация цикла будет представлять собой список из 2 элементов (mu и rooti). Таким образом, вам нужен только один lapply:

ll <- list(list(mu = runif(15), root = runif(10)), list(mu = runif(15), runif(10)))

str(ll)
#List of 2
# $ :List of 2
#  ..$ mu  : num [1:15] 0.314 0.614 0.228 0.594 0.447 ...
#  ..$ root: num [1:10] 0.73 0.496 0.266 0.599 0.917 ...
# $ :List of 2
#  ..$ mu: num [1:15] 0.134 0.244 0.507 0.771 0.934 ...
#  ..$   : num [1:10] 0.818 0.138 0.83 0.509 0.914 ...

lapply(ll, function(x) mean(x$mu))
#[[1]]
#[1] 0.4264001
#
#[[2]]
#[1] 0.4526724
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...