【问题标题】:Processing nested lists in R在 R 中处理嵌套列表
【发布时间】:2018-05-07 18:03:06
【问题描述】:

我有一个嵌套列表,结构如下:

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

我知道我可以使用hb.post.PT1$compdraw[[1]]$mu 访问$mu,但是如何提取或循环它们以执行函数?

我一直在尝试这样的事情但没有成功:

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

抱歉,我无法发布示例列表数据。

【问题讨论】:

    标签: r list nested


    【解决方案1】:

    您已经使用第一个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
    

    【讨论】:

      【解决方案2】:

      你可以使用

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

      【讨论】:

      • 或者只是map_dbl(hb.post.PT1$compdraw , ~mean(.$mu))
      • 好@Moody_Mudskipper!我是purrr 初学者。
      【解决方案3】:

      这就是我使用 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 年 5 月 7 日创建。

      【讨论】:

        【解决方案4】:

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

        map(transpose(hb.post.PT1$compdraw)$mu,mean)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-15
          • 1970-01-01
          • 2020-08-28
          • 1970-01-01
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 2013-05-12
          相关资源
          最近更新 更多