【问题标题】:How to apply a function on every element of all elements in a list in R如何对R中列表中所有元素的每个元素应用函数
【发布时间】:2017-09-15 10:52:42
【问题描述】:

我在 R 中有一个包含相同大小矩阵的列表。我想对所有矩阵的相同元素应用一个函数。示例:

> a <- matrix(1:4, ncol = 2)
> b <- matrix(5:8, ncol = 2)
> c <- list(a,b)
> c
[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

[[2]]
     [,1] [,2]
[1,]    5    7
[2,]    6    8

现在我想应用均值函数并希望得到一个这样的矩阵:

      [,1] [,2]
[1,]    3    5
[2,]    4    6

【问题讨论】:

  • 在这个简单的示例中,您可以尝试d = (a + b) / 2,它会返回所需的矩阵。

标签: r list apply


【解决方案1】:

执行此操作的一种概念方法是将矩阵求和,然后取每个条目的平均值。尝试使用Reduce

Reduce('+', c) / length(c)

输出:

     [,1] [,2]
[1,]    3    5
[2,]    4    6

演示在这里:

Rextester

【讨论】:

    【解决方案2】:

    另一种选择是构造一个数组,然后使用apply

    第 1 步:构造数组。
    使用abind 库和do.call,您可以这样做:

    library(abind)
    myArray <- do.call(function(...) abind(..., along=3), c)
    

    使用基础 R,您可以剥离结构,然后像这样重建它:

    myArray <- array(unlist(c), dim=c(dim(a), length(c)))
    

    在这两种情况下,它们都返回所需的数组

    , , 1
    
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    
    , , 2
    
         [,1] [,2]
    [1,]    5    7
    [2,]    6    8
    

    第 2 步:使用apply 计算沿第一维和第二维的平均值。

    apply(myArray, 1:2, mean)
         [,1] [,2]
    [1,]    3    5
    [2,]    4    6
    

    这将比Reduce 更灵活,因为您可以换出更多功能,但对于这个特定的应用程序来说会更慢。

    【讨论】:

      猜你喜欢
      • 2014-06-09
      • 2020-11-02
      • 2021-12-26
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2019-05-26
      • 2020-02-22
      相关资源
      最近更新 更多