在矩阵上使用 mapply 和均值函数
Using mapply with mean function on a matrix
我想计算矩阵每一列(或行)中相邻值的平均值(例如 [1,1] 和 [2,1]、[2,1] 和 [3,1] 的平均值]、[3,1] 和 [4,1]) 并将其应用于所有列。
我尝试使用 mapply 函数(避免使用 for 循环)来计算每列中前 2 个值的平均值,并计划将其逐行应用于整个矩阵。但是,如果我尝试对值求和而不是对均值函数求和,那么 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
使用均值函数时,输出似乎是第一行的值。我怀疑问题在于索引正确的输入值。
我认为这会满足您的要求:
(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 行,依此类推。最后我们只除以二,得到平均值。
你的方法失败的原因是因为 mean
只对它的第一个参数取平均值,不像 sum
它对所有参数求和:
> args(mean)
function (x, ...)
NULL
> args(sum)
function (..., na.rm = FALSE)
NULL
sum
对所有 ...
求和,但 mean
只取 x
的平均值,所以第二行你传递给 mean
与 mapply
被丢弃(或者更糟的是,被用作 trim
参数,参见 ?mean
)。
您可以使用:
library(zoo)
apply(x, 2, function(x) rollapply(x, 2, mean))
我想计算矩阵每一列(或行)中相邻值的平均值(例如 [1,1] 和 [2,1]、[2,1] 和 [3,1] 的平均值]、[3,1] 和 [4,1]) 并将其应用于所有列。
我尝试使用 mapply 函数(避免使用 for 循环)来计算每列中前 2 个值的平均值,并计划将其逐行应用于整个矩阵。但是,如果我尝试对值求和而不是对均值函数求和,那么 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
使用均值函数时,输出似乎是第一行的值。我怀疑问题在于索引正确的输入值。
我认为这会满足您的要求:
(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 行,依此类推。最后我们只除以二,得到平均值。
你的方法失败的原因是因为 mean
只对它的第一个参数取平均值,不像 sum
它对所有参数求和:
> args(mean)
function (x, ...)
NULL
> args(sum)
function (..., na.rm = FALSE)
NULL
sum
对所有 ...
求和,但 mean
只取 x
的平均值,所以第二行你传递给 mean
与 mapply
被丢弃(或者更糟的是,被用作 trim
参数,参见 ?mean
)。
您可以使用:
library(zoo)
apply(x, 2, function(x) rollapply(x, 2, mean))