r-使用mapply对向量列表执行操作:索引规范的问题



我有两个列表(A和B),每个列表包含5个长度为3的向量。我还有一个3x3矩阵Z。

我想使用B和Z对A的元素执行运算,并将其输出到3x5矩阵。我能够使用如下的for循环成功地做到这一点

#Create two lists of vectors
A = list(c(1,2,1), c(2,1,2), c(3,2,2),c(1,2,5),c(1,4,2))
B = list(c(2,3,1), c(1,3,4), c(2,5,2), c(2,4,1),c(1,4,1))
#Create 3x3 matrix
Z = rbind(c(2,3,5),c(3,2,3), c(1,1,1))
#initialize empty 3x5 matrix
Y = matrix(NA,3,5)
for (i in 1:3)
{
for (j in 1:5)
{
#Take the ith element of the jth vector from A, and divide it by
#the dot product of the jth vector from B and the ith row of Z
Y[i,j] = A[[j]][i] / sum(B[[j]]*Z[i,])
}
}

这返回(对于Y)

[,1]       [,2]       [,3]       [,4]       [,5]
[1,] 0.05555556 0.06451613 0.10344828 0.04761905 0.05263158
[2,] 0.13333333 0.04761905 0.09090909 0.11764706 0.28571429
[3,] 0.16666667 0.25000000 0.22222222 0.71428571 0.33333333

我正试图弄清楚如何使用mapply来提高效率。

到目前为止,我得到了这个:

mapply(function(x,y,z) x/sum(y*z), x=A,y=B,z = Z)

但这不正常。我认为,也许把任务分成两个单独的mapply就可以了,也许我需要重新组织矩阵和列表,以便索引以某种方式匹配。我在应用函数族方面取得了一些成功,但我还不够流利,无法找出如何最好地解决这个问题。如果有任何指导,我将不胜感激。

我决定把它分成两个步骤,就像你想的那样。这里有一种方法:

BZ <- lapply(B, FUN = function(y) 
apply(Z, 1, FUN = function(x) sum(y*x)))
mapply(function(x,y) x / y, x = A, y = BZ)
[,1]       [,2]       [,3]       [,4]       [,5]
[1,] 0.05555556 0.06451613 0.10344828 0.04761905 0.05263158
[2,] 0.13333333 0.04761905 0.09090909 0.11764706 0.28571429
[3,] 0.16666667 0.25000000 0.22222222 0.71428571 0.33333333