从列表中获取值并将其用作索引

时间:2017-07-19 15:21:30

标签: r list indexing

我有一个这样的矩阵(A)(行和列的名称是识别码(ID):

     1   3  10  38  46
 1   0 0.4   0   0   0
 3   0   0   0   0   0
10   0   0 0.9 0.8   0
38   0   0   0   0   0
46   0 0.1   0   0   0

另一个矩阵(B)是这样的:

               a            b            c
1   2.676651e-04 4.404911e-06 9.604227e-06
3   6.073389e-10 3.273222e-05 3.360321e-04
10  4.156392e-08 1.269607e-06 7.509217e-06
38  4.200699e-08 3.227431e-02 8.286920e-11
46  9.352353e-05 3.318948e-20 8.694981e-06

我想取A矩阵的元素索引> 0,因此我使用了这个命令:

temp <- apply(A,1, FUN=function(x) which(x>0))

它返回了一个列表,其中包含元素&gt; 0的正确索引。

之后,我想使用索引乘以矩阵B的元素。特别是,我想为每一行做类似的事情:

1: 6.073389e-10*3.273222e-05*3.360321e-04 

我已经使用矩阵A的信息(在第一行的第二列中我有一个值> 0)作为索引来获取第一行的矩阵B中的元素。

对于第二行,我获得0,因为A [2,]> 0

中没有元素

对于第三行,我想获得类似第一行的内容,但我应该总结这两个产品

10: 4.156392e-08*1.269607e-06*7.509217e-06  +4.200699e-08*3.227431e-02*8.286920e-11

我试图取消列表列表,但是这样我获得了一个丢失ID

之间对应的向量

1 个答案:

答案 0 :(得分:0)

A <-
  matrix(
    c(0, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9, 0.8, 0, 0, 0, 0, 0,  0, 0, 0.1, 0, 0, 0),
    nrow = 5,
    ncol = 5,
    byrow = T
  )
B <-
  matrix(
    c(
      2.676651e-04, 4.404911e-06, 9.604227e-06,
      6.073389e-10, 3.273222e-05, 3.360321e-04,
      4.156392e-08, 1.269607e-06, 7.509217e-06,
      4.200699e-08, 3.227431e-02, 8.286920e-11,
      9.352353e-05, 3.318948e-20, 8.694981e-06
    ),
    nrow = 5,
    ncol = 3,
    byrow = T
  )

idx<-which(A>0, arr.ind = T)

result <- 0;
for (i in 1:nrow(idx)) {
  cat(A[idx[i,1],idx[i,2]], sep="\n")
  cat(B[idx[i,2], ], sep="\n")
  result = result + sum(A[idx[i,1],idx[i,2]] * B[idx[i,2],])
}
cat("result=")
cat(result)