使用 mapply 对向量列表执行操作:索引规范有问题
Using mapply to perform operations on lists of vectors: trouble with index specification
我有两个列表(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,])
}
}
这个returns(对于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 可能会达到目的,也许我需要重新组织矩阵和列表,以便索引以某种方式匹配。我在 apply 函数族方面取得了一些成功,但我还不够流利,无法弄清楚如何最好地解决这个问题。如果有任何指导,我将不胜感激。
我决定把它分成两步,就像你想的那样。这是一种方法:
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
我有两个列表(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,])
}
}
这个returns(对于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 可能会达到目的,也许我需要重新组织矩阵和列表,以便索引以某种方式匹配。我在 apply 函数族方面取得了一些成功,但我还不够流利,无法弄清楚如何最好地解决这个问题。如果有任何指导,我将不胜感激。
我决定把它分成两步,就像你想的那样。这是一种方法:
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