【问题标题】:Using mapply with mean function on a matrix在矩阵上使用带有均值函数的 mapply
【发布时间】:2015-07-01 18:04:11
【问题描述】:

我希望计算矩阵每一列(或行)中相邻值的平均值(例如 [1,1] 和 [2,1]、[2,1] 和 [3,1] 的平均值, [3,1] 和 [4,1]) 并将其应用于所有列。

我尝试使用 mapply 函数(以避免使用 for 循环)来计算每列中前 2 个值的平均值,并计划将其逐行应用于整个矩阵。但是,如果我尝试对这些值求和而不是对均值函数求和,这似乎可行。

请看下面的例子:

x <- matrix(c(NA,rnorm(28),NA), nrow=6, ncol=5)
print(x)
       [,1]       [,2]       [,3]       [,4]       [,5]
[1,]          NA -0.6557176  1.7741320  0.3667700 -0.5548408
[2,]  0.14001643  0.2521062 -0.1295084 -0.4272368  0.7598425
[3,]  0.32123196  0.5736409  0.8618268  2.1535191  0.4686728
[4,]  0.06573949 -1.2101965 -0.4308219 -0.2624877 -0.3751350
[5,] -0.66247996  1.2743463  1.6044236  1.2004990 -0.3283678
[6,]  1.05005260  1.2264607  3.2347421 -0.8113528         NA

mapply(sum, x[1,], x[2,])
[1]          NA -0.40361136  1.64462358 -0.06046682  0.20500169
# gives the sum of the input of rows 1 and 2 for each column, as expected

mapply(mean, x[1,], x[2,])
[1]         NA -0.6557176  1.7741320  0.3667700 -0.5548408
# gives the actual values across row 1

使用均值函数时,输出似乎是第一行的值。我怀疑问题在于索引正确的输入值。

【问题讨论】:

    标签: r matrix mean mapply


    【解决方案1】:

    你可以使用:

    library(zoo)
    apply(x, 2, function(x) rollapply(x, 2, mean))
    

    【讨论】:

      【解决方案2】:

      我认为这会做你想要的:

      (head(x, -1L) + tail(x, -1L)) / 2
      

      产生(使用set.seed(1) 的数据):

                 [,1]       [,2]        [,3]      [,4]       [,5]
      [2,]         NA -0.1665197 -0.11569867 0.8825287 -0.6847630
      [3,] -0.2214052  0.6128769 -1.41797023 0.7075613  0.2818485
      [4,] -0.3259926  0.6570530 -0.54488448 0.7564393 -0.1059621
      [5,]  0.3798261  0.1351965  0.53999865 0.8505568 -0.8132739
      [6,]  0.9623943  0.6031964 -0.03056194 0.4283506         NA
      

      tail(x, -1L) 给出除了第一行之外的每一行的矩阵。所以结果矩阵的第一行是原始矩阵的第二行,第二行是第三行,依此类推。然后我们将其添加到原始矩阵减去第一行。这相当于将第 2 行添加到第 1 行,将第 3 行添加到第 2 行,等等。最后我们只需除以 2,得到平均值。

      您的方法失败的原因是 mean 仅对其第一个参数求平均值,而 sum 将其所有参数求和:

      > args(mean)
      function (x, ...) 
      NULL
      > args(sum)
      function (..., na.rm = FALSE) 
      NULL    
      

      sum 将所有... 相加,但mean 仅取x 的平均值,因此您传递给meanmapply 的第二行将被丢弃(或更糟的是,正在使用作为trim 参数,请参见?mean)。

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-08-16
        • 2017-09-11
        • 2014-12-04
        • 2023-01-26
        • 1970-01-01
        • 2018-03-11
        相关资源
        最近更新 更多