R 在三维数组上应用加权平均值

R 在三维数组上应用加权平均值,r,R,我试图在三维数组上应用加权平均值 测试数据: set.seed(1) arr <- array(round(runif(24, 0, 10)), c(3, 4, 2)) wgt <- matrix(round(runif(12), 1), c(3, 4)) 这样就可以了,将我的(3×4×2)数组转换成一个(3×2)矩阵,就像我想要的那样。现在我希望它是加权平均值,而不是正常平均值 apply(arr, c(1, 3), weighted.mean, wgt) Error in we

我试图在三维数组上应用加权平均值

测试数据:

set.seed(1)
arr <- array(round(runif(24, 0, 10)), c(3, 4, 2))
wgt <- matrix(round(runif(12), 1), c(3, 4))
这样就可以了,将我的(3×4×2)数组转换成一个(3×2)矩阵,就像我想要的那样。现在我希望它是加权平均值,而不是正常平均值

apply(arr, c(1, 3), weighted.mean, wgt)
Error in weighted.mean.default(newX[, i], ...) : 
  'x' and 'w' must have the same length
我想这不起作用,可能是因为加权平均值对矩阵不起作用。(我需要一个mapply或应用程序内部的东西)。不管怎样,我想我会先乘以然后求和,这样做加权平均值:

apply(arr, c(1, 3), "*", wgt)
, , 1

      [,1] [,2] [,3]
 [1,]  0.9  1.2  1.8
 [2,]  3.6  0.8  3.6
 [3,]  0.0  0.0  0.0
 [4,]  0.4  0.8  0.8
 [5,]  2.7  3.6  5.4
 [6,]  2.7  0.6  2.7
 [7,]  4.5  3.5  3.0
 [8,]  0.6  1.2  1.2
 [9,]  1.5  2.0  3.0
[10,]  1.8  0.4  1.8
[11,]  7.2  5.6  4.8
[12,]  0.7  1.4  1.4

, , 2

      [,1] [,2] [,3]
 [1,]  2.1  1.2  2.4
 [2,]  2.0  2.8  4.0
 [3,]  0.0  0.0  0.0
 [4,]  0.8  2.8  0.4
 [5,]  6.3  3.6  7.2
 [6,]  1.5  2.1  3.0
 [7,]  2.0  4.0  4.5
 [8,]  1.2  4.2  0.6
 [9,]  3.5  2.0  4.0
[10,]  1.0  1.4  2.0
[11,]  3.2  6.4  7.2
[12,]  1.4  4.9  0.7
结果没有我预期的尺寸。实际上,我想:

for(i in 1:dim(arr)[3]) print(arr[,, i] * wgt)
     [,1] [,2] [,3] [,4]
[1,]  0.9  3.6  4.5  0.2
[2,]  1.6  1.8  4.2  1.6
[3,]  0.0  2.7  3.0  1.4
     [,1] [,2] [,3] [,4]
[1,]  2.1  2.0  2.0  0.4
[2,]  1.6  6.3  4.8  5.6
[3,]  0.0  3.0  4.5  0.7
最后:

> temp <- array(NA, c(3, 4, 2))
> for(i in 1:dim(arr)[3]) temp[,, i] <- arr[,, i] * wgt
> apply(temp, c(1, 3), sum)
     [,1] [,2]
[1,]  9.2  6.5
[2,]  9.2 18.3
[3,]  7.1  8.2
你知道哪里出了问题,我该怎么解决吗


谢谢

在您的
apply
中,“wgt”是一个按原样传递的(矩阵),像
weighted.mean(arr[1,1],wgt)
这样的调用必须进行计算,因此会出现错误。你可以用apply(arr*c(wgt),c(1,3),sum)来简化你的代码。或者,甚至可以尝试一下colSums(aperm(arr*c(wgt),c(2,1,3))的效率。谢谢@alexis_laz,这很有效。我仍然不明白为什么
apply(arr,c(1,3),“*”,wgt)
不起作用,但是你的
arr*c(wgt)
无论如何效果更好。至于速度,对于我的真实数据,culSums选项更快,但我的数据量不够大,无法看出它的速度有多快。使用
apply(arr,c(1,3),deparse)
查看数组的哪个部分每次都被传递到
“*”
——对于每个“i”和“k”,您都会得到一个
arr[i,k]*wgt
已评估调用。使用deparse的技巧非常有趣,我已记下它以备将来使用!这让我了解了如何修复代码<代码>数组(应用(arr,c(3),“*”,wgt),c(3,4,2))相当于您的
arr*c(wgt)
。您的代码仍然更好,但是我们看到apply工作了,但是维度丢失了。再次感谢。在您的
apply
中,“wgt”是一个按原样传递的(矩阵),像
加权的调用。必须计算平均值(arr[1,1],wgt)
,因此会出现错误。你可以用apply(arr*c(wgt),c(1,3),sum)来简化你的代码。或者,甚至可以尝试一下colSums(aperm(arr*c(wgt),c(2,1,3))的效率。谢谢@alexis_laz,这很有效。我仍然不明白为什么
apply(arr,c(1,3),“*”,wgt)
不起作用,但是你的
arr*c(wgt)
无论如何效果更好。至于速度,对于我的真实数据,culSums选项更快,但我的数据量不够大,无法看出它的速度有多快。使用
apply(arr,c(1,3),deparse)
查看数组的哪个部分每次都被传递到
“*”
——对于每个“i”和“k”,您都会得到一个
arr[i,k]*wgt
已评估调用。使用deparse的技巧非常有趣,我已记下它以备将来使用!这让我了解了如何修复代码<代码>数组(应用(arr,c(3),“*”,wgt),c(3,4,2))相当于您的
arr*c(wgt)
。您的代码仍然更好,但是我们看到apply工作了,但是维度丢失了。再次感谢。
> temp <- array(NA, c(3, 4, 2))
> for(i in 1:dim(arr)[3]) temp[,, i] <- arr[,, i] * wgt
> apply(temp, c(1, 3), sum)
     [,1] [,2]
[1,]  9.2  6.5
[2,]  9.2 18.3
[3,]  7.1  8.2
apply(arr, c(1), "*", wgt)
apply(arr, c(2), "*", wgt)
apply(arr, c(3), "*", wgt)
apply(arr, c(1, 2), "*", wgt)
apply(arr, c(1, 3), "*", wgt)
apply(arr, c(2, 3), "*", wgt)
apply(arr, c(1, 2, 3), "*", wgt)