在矩阵上使用mapply函数和mean函数

4
我希望能够计算矩阵中每一列(或行)相邻值的平均值(例如,[1,1]和[2,1]的平均值,[2,1]和[3,1]的平均值,[3,1]和[4,1]的平均值),并将其应用于所有列。我尝试使用mapply函数(避免使用for循环)计算每列前两个值的平均值,并计划逐行应用到整个矩阵中。但是,mapply函数似乎可以用来对值进行求和,但不能用于平均数函数。请参见以下示例:
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

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

1

您可以使用:

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

0

我认为这将实现你想要的功能:

(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)会返回一个矩阵,其中包含除第一行以外的所有行。因此,结果矩阵的第一行是原始矩阵的第二行,第二行是第三行,以此类推。然后我们将其加到原始矩阵减去第一行的结果上。这相当于将第二行添加到第一行,第三行添加到第二行,以此类推。最后我们只需除以二,即可得到平均值。

你的方法失败的原因是mean只对其第一个参数求平均值,而不像sum一样对所有参数求和:

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

sum函数对所有的数值进行求和,而mean函数只计算x的平均值,所以你用mapply将第二行传递给mean时会被忽略掉(或者更糟糕的是,被误用作trim参数,参见?mean)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接