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)