处理R中的嵌套列表

时间:2018-05-07 18:03:07

标签: r list nested

我有一个嵌套列表,其中包含以下结构:enter image description here

每个$mu是15个数字的向量。 如何计算1000 $mu个中15个元素的平均值?

我知道我可以使用$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 :(得分:2)

您已经使用第一个lapply循环遍历每个列表元素。因此,根据您的结构,循环的每个迭代将是2个元素的列表(murooti)。所以你只需要一个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

答案 1 :(得分:0)

您可以使用

hb.post.PT1$compdraw %>%
 purrr::map(function(x) {
   mean(x$mu)
 }) %>% unlist

答案 2 :(得分:0)

这就是我用tidyverse的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

reprex package(v0.2.0)创建于2018-05-07。

答案 3 :(得分:0)

对于这种情况可能有点矫枉过正,但对于这类问题,一般来说记住purrr::transpose

是件好事。
map(transpose(hb.post.PT1$compdraw)$mu,mean)