使用mapply对向量列表执行操作:索引规范出现问题

时间:2016-06-09 00:16:40

标签: r list vector 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可能会成功,也许我需要重新组织矩阵和列表,以便索引以某种方式匹配。我在应用函数系列方面取得了一些成功,但我还不够流利,无法弄清楚如何最好地解决这个问题。我很感激任何指导。

1 个答案:

答案 0 :(得分:1)

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

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
相关问题