如何将向量中的另一组元素与矩阵相乘,将所有其他元素设置为零

时间:2018-01-29 15:05:27

标签: r matrix vector

这个问题类似于我问previously的问题,但我在这里定义的组略有不同。

我试图将向量内的某些元素与矩阵相乘,同时将向量中的所有其他元素设置为零,然后为下一个组重复该过程。我想要使​​用的元素是n个元素。

我的数据集非常大,所以为了便于说明,请:

a <- c(2:7)
b <- matrix(1:36, byrow = TRUE, nrow = 6)
description <- c("AA1", "AA2", "AA3", "BB1", "BB2", "BB3")
names(a) <- description

,并提供:

a

AA1 AA2 AA3 BB1 BB2 BB3 
  2   3   4   5   6   7 

b
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30
[6,]   31   32   33   34   35   36

将a定义为具有三个组:

  • 第1组和第4组
  • 第2组和第5组
  • 第3组和第3组

所以在这个例子中,我希望匹配向量中具有相同数字的每个元素,然后将其与矩阵相乘。因此,对于组1,向量将是(2, 0, 0, 5, 0, 0)组2 (0, 3, 0, 0, 6, 0)和组3 (0, 0, 4, 0, 0, 7)

组1的向量矩阵乘法(a %*% b)将给出结果:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   97  104  111  118  125  132

所以我想要使用grepl代码匹配向量中的数字,或者以某种方式告诉r将组之间的两个元素设置为零,然后为下一个组重复该过程。 / p>

最好的代码是什么?

1 个答案:

答案 0 :(得分:1)

g是分组向量c(1, 2, 3, 1, 2, 3),使得对应于分组向量的相同值的所有元素属于同一组。  现在outer(...)给出了一个三列矩阵Ind,其每列都是一个组的指示变量。对于Ind的每一列,在sapply

中执行指定的计算
g <- as.numeric(gsub("\\D", "", names(a)))
Ind <- outer(g, unique(g), `==`)
sapply(1:ncol(Ind), function(i) a %*% (b * Ind[, i]))

,并提供:

     [,1] [,2] [,3]
[1,]   97  171  269
[2,]  104  180  280
[3,]  111  189  291
[4,]  118  198  302
[5,]  125  207  313
[6,]  132  216  324

最后一行代码可以写成:

sapply(split(Ind, col(Ind)), function(ind) a[ind] %*% b[ind, ])

sapply(1:ncol(Ind), function(i) a %*% diag(Ind[, i]) %*% b)

更新:根据问题的澄清进行了修订。