【问题标题】:Compute means across a list on R计算 R 上一个列表的平均值
【发布时间】:2018-10-01 07:06:19
【问题描述】:

我有一个结构如下的列表:

> str(test)
List of 5
$ :List of 2
..$ : num [1:4] 0.0544 0.0839 0.0486 0.043
..$ : num [1:4] 0.0799 0.2434 0.0373 0.2166
$ :List of 2
..$ : num [1:6] 0.938 1.047 1.022 0.689 0.39 ...
..$ : num [1:6] 0.871 0.25 0.824 0.664 0.481 ...
$ :List of 2
..$ : num [1:4] 0.000598 0.000923 0.000535 0.000473
..$ : num [1:4] 0.001039 0.003164 0.000485 0.002816
$ :List of 2
..$ : num [1:6] 0.01032 0.01152 0.01124 0.00758 0.00429 ...
..$ : num [1:6] 0.01133 0.00325 0.01071 0.00864 0.00625 ...
$ :List of 2
..$ : num -0.659
..$ : num -0.962

我想计算每个条目的平均值,即我想要的第一个条目:

x <- mean(c(0.0544, 0.0839, 0.0486, 0.043))
y <- mean(c(0.0799, 0.2434, 0.0373, 0.2166)) 

最后是这两个结果的平均值 = mean(c(x,y).

最有效的方法是什么?

【问题讨论】:

标签: r list mean


【解决方案1】:

示例数据 - 一个(父)列表(子)列表。

set.seed(1)
foo <- list(
            list(runif(4),runif(4)),
            list(runif(6),runif(6))
           )
#> [[1]]
#> [[1]][[1]]
#> [1] 0.2655087 0.3721239 0.5728534 0.9082078
#> 
#> [[1]][[2]]
#> [1] 0.2016819 0.8983897 0.9446753 0.6607978
#> 
#> 
#> [[2]]
#> [[2]][[1]]
#> [1] 0.62911404 0.06178627 0.20597457 0.17655675 0.68702285 0.38410372
#> 
#> [[2]][[2]]
#> [1] 0.7698414 0.4976992 0.7176185 0.9919061 0.3800352 0.7774452

获取每个子列表的均值:

foo_means <- lapply(foo, lapply, mean)
#> [[1]]
#> [[1]][[1]]
#> [1] 0.5296734
#> 
#> [[1]][[2]]
#> [1] 0.6763862
#> 
#> 
#> [[2]]
#> [[2]][[1]]
#> [1] 0.3574264
#> 
#> [[2]][[2]]
#> [1] 0.6890909

获取每个(父)列表元素的(子)平均值:

lapply(foo_means, function(x) mean(unlist(x)))
#> [[1]]
#> [1] 0.6030298
#> 
#> [[2]]
#> [1] 0.5232587

【讨论】:

    【解决方案2】:

    第一个问题似乎非常适合 rapply。使用与上面@ngm 的答案中提供的相同示例数据,您可以这样做:

    foo2 <- rapply(foo, mean, how = "replace")
    
    foo2
    #[[1]]
    #[[1]][[1]]
    #[1] 0.5296734
    #
    #[[1]][[2]]
    #[1] 0.6763862
    #
    #
    #[[2]]
    #[[2]][[1]]
    #[1] 0.3574264
    #
    #[[2]][[2]]
    #[1] 0.6890909
    

    【讨论】:

      【解决方案3】:

      既然你列表的元素也是列表,那么就使用一些嵌套的lapply's 来获取每个列表的均值。

      lapply(test, function(x) lapply(x, mean))
      

      如果你喜欢矩阵作为输出,你可以这样做

      sapply(test, function(x) sapply(x, mean))
      

      使用sapply,您可以获得每对的均值

      colMeans(sapply(test, function(x) sapply(x, mean, na.rm = TRUE)))
      

      【讨论】:

        【解决方案4】:

        这个问题已经回答过很多次了。 就这么简单

        mean(unlist(lapply(mylist,sapply,mean)))
        

        点击此链接。

        Grouping functions (tapply, by, aggregate) and the *apply family

        【讨论】:

        • 是的,我知道 lapply 将是正确的方法,但我在列表问题中的列表遇到了一些问题......但是,我发现 lapply(test, FUN = function(x) {mean(unlist(x))}) 似乎也有效
        【解决方案5】:

        您还可以使用 purrr 包中的 modify_depth 函数。以@ngm 发布的示例为例

        library(purrr)
        
        set.seed(1)
        foo <- list(list(runif(4), runif(4)),
                    list(runif(6), runif(6)))
        
        modify_depth(foo, 2, mean)
        
        #> [[1]]
        #> [[1]][[1]]
        #> [1] 0.5296734
        #> 
        #> [[1]][[2]]
        #> [1] 0.6763862
        #> 
        #> 
        #> [[2]]
        #> [[2]][[1]]
        #> [1] 0.3574264
        #> 
        #> [[2]][[2]]
        #> [1] 0.6890909
        

        编辑:计算该列表第一级中所有元素的平均值

        modify_depth(foo, 2, mean) %>% 
          map(flatten_dbl) %>% 
          map_dbl(mean)
        
        modify_depth(foo, 2, mean) %>% 
          simplify_all() %>% 
          map_dbl(mean)
        
        [1] 0.60303 0.52326
        

        reprex package (v0.2.0) 于 2018 年 4 月 20 日创建。

        【讨论】:

          猜你喜欢
          • 2021-09-02
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          • 1970-01-01
          • 2014-03-15
          • 1970-01-01
          • 2017-12-05
          • 2016-12-14
          相关资源
          最近更新 更多